笔者总结不容易点个关注吧 一键三联哦! 感谢您!
python pyinstaller打包exe添加版本信息
打包并添加版本信息
注意!这里有个坑 如果第二次要修改版权信息 要将file_version_info.txt改为新的名称才生效
pyinstaller --version-file file_version_info.txt -D -w -i .\favicon.ico .\getMusic.py
# UTF-8 # # For more details about fixed file info 'ffi' see: # http://msdn.microsoft.com/en-us/library/ms646997.aspx VSVersionInfo( ffi=FixedFileInfo( # filevers and prodvers should be always a tuple with four items: (1, 2, 3, 4) # Set not needed items to zero 0. filevers和prodvers应该始终是包含四个项的元组:(1、2、3、4),将不需要的项设置为0 filevers=(1, 0, 0, 0), # 文件版本******,鼠标悬浮exe会显示,也显示在 详细信息-文件版本,这个是检测版本的依据 prodvers=(1, 0, 0, 0), # 生产商,未见显示在哪里 # Contains a bitmask that specifies the valid bits 'flags'r mask=0x3f, # 两个位掩码 # Contains a bitmask that specifies the Boolean attributes of the file. flags=0x0, # The operating system for which this file was designed. # 0x4 - NT and there is no need to change it. OS=0x40004, # 为其设计此文件的操作系统,0x4-NT,无需更改它 # The general type of file. # 0x1 - the file is an application. fileType=0x1, # 文件的常规类型,0x1-该文件是一个应用程序 # The function of the file. # 0x0 - the function is not defined for this fileType subtype=0x0, # 文件的功能,0x0表示该文件类型未定义 # Creation date and time stamp. date=(0, 0) # 创建日期和时间戳 ), kids=[ StringFileInfo( [ StringTable( u'080404b0', [StringStruct(u'CompanyName', u'AND'), # 公司,鼠标悬浮exe会显示 StringStruct(u'FileDescription', u'AND'), # 文件说明,鼠标悬浮exe会显示,也会显示在 详细信息-文件说明 StringStruct(u'FileVersion', u'1.0.0.0'), # 没见哪里显示 StringStruct(u'LegalCopyright', u'Copyright (C) 2021 AND'), # 版权,会显示在 详细信息-版权 StringStruct(u'ProductName', u'AND'), # 原始文件名,会显示在 详细信息-原始文件名 StringStruct(u'ProductVersion', u'1.0.0.0')]) # 产品版本,会显示在 详细信息-产品版本 ]), VarFileInfo([VarStruct(u'Translation', [2052, 1200])]) # 语言,中文简体 ] )
如果想把语言转成中文,可以把VarFileInfo([VarStruct(u'Translation', [1033, 1200])])改成VarFileInfo([VarStruct(u'Translation', [2052, 1200])])
pyinstaller --version-file file_version_info.txt -D -w -i .\favicon.ico .\getMusic.py
注意!这里有个坑 如果第二次要修改版权信息 要将file_version_info.txt改为新的名称才生效
运行后结果: 可以看到已经增加了版本信息
具体信息可以修改file_version_info.txt文件中的描述
右键详细信息:
python获取exe版本信息
python获取exe版本信息源代码如下:
# @CSDN王家视频教程图书馆
# @Time 2023-01-13 20:50
from win32com.client import Dispatch
def get_version_via_com(filename):
parser = Dispatch("Scripting.FileSystemObject")
version = parser.GetFileVersion(filename)
print(version)
return version
if __name__ == "__main__":
path1 = "C:/Users/xiangbin/Desktop/AA/AND/AND.exe"#这个exe没有版权信息
path2 =r'C:\Users\xiangbin\PycharmProjects\pythonProject2\根据歌曲名称目录自动化批量下载歌曲\dist\getMusic\getMusic.exe'
get_version_via_com(path2)
pyqt5开发exe添加检查版本更新功能
Python编程:paramiko模块远程登录-阿里云开发者社区
Python编程:paramiko模块远程登录-阿里云开发者社区
这篇文章末尾中点击:
请现在阿里云控制台生成秘钥 然后再导出点pem文件格式的秘钥
Paramiko的ssh模块使用无密码方式远程链接阿里云服务器
# @CSDN王家视频教程图书馆
# @Time 2023-01-13 20:50
import paramiko
# 公加
pkey = paramiko.RSAKey.from_private_key_file('id_rsa')
# 建立连接
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname='39.106.155.202',
port=22,
username='root',
pkey=pkey)
# 执行命令
stdin, stdout, stderr = ssh.exec_command('df -hl')
# 结果放到stdout中,如果有错误将放到stderr中
print(stdout.read().decode())
# 关闭连接
ssh.close()
问题:paramiko.ssh_exception.SSHException: Server '39.106.155.202' not found in known_hosts
解决:
允许连接不在know_hosts文件中的主机
ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
问题:paramiko.ssh_exception.AuthenticationException: Authentication failed.
这个问题笔者用了三个小时才解决(阿里云社区也没有讲清楚)
解决:
问题背景
在项目中会使用python中的Paramiko ssh模块完成对远程服务器的部署和执行命令。当在某一次对新镜像进行部署时,却发现Paramiko的ssh模块使用无密码方式却一直无法连接到指定服务器。使用密码方式去可以登录成功。
Paramiko模块一直会提示Authentication (publickey) failed问题,整个过程还是挺曲折的,所以记录和分析给大家。 以下是解决和分析该问题的主要关键步骤:
解决原理参考自: 阿里云ECS利用密钥对ssh登录服务器_NicolasLearner的博客-CSDN博客_ecs-密钥对登录
具体原因参考资料:http://t.csdn.cn/YBCLq
以上需要确保被访问的服务器对应用户.ssh目录下有authorized_keys文件,也就是将服务器上生成的公钥文件保存为authorized_keys。并将私钥文件作为paramiko的登陆密钥
关于RSA非对称加密
A 电脑 --登陆–> B 电脑
A: private key 私钥
B: public key 公钥
以root用户为例:
linux 生成公钥私钥对 (密码均为空):ssh-keygen
首先生成公钥和私钥 公钥加密 私钥解密
输入命令ssh-keygen 生成 生成部分就不截图了
# @CSDN王家视频教程图书馆
# @Time 2023-01-13 20:501 进入目录:
命令:cd ~/.ssh
2拷贝一份公钥并命名为authorized_keys
命令:cp id_rsa.pub authorized_keys
3下载文件到本地为私钥在py文件中使用
命令: sz id_rsa
示意图:
右键运行控制台打印输入可以看到已经使用rsa非对称加密文件代替了阿里云登录ssh的密码进行了登录操作
列出了远程阿里云服务器的文件
前方高能 上代码
功能1 检查版本更新
功能2 获取远程服务器版本
功能3 获取本地exe版本信息
功能4 下载远程文件夹下所有文件到本地
功能5 上传本地文件到远程 下载远程文件到本地
功能6 python操作本地文件夹和文件 创建 删除 修改 复制
# @CSDN王家视频教程图书馆
# @Time 2023-01-13 20:50
local_version=''
remote_version=''
#获取远程服务器AND版本号
import paramiko
import os,shutil
# 公加
pkey = paramiko.RSAKey.from_private_key_file('id_rsa')
# 建立连接
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname='39.106.155.202',
port=22,
username='root',
pkey=pkey)
#获取版本方式一
import fnmatch
sftp = ssh.open_sftp()
for filename in sftp.listdir('/AND'):
if fnmatch.fnmatch(filename, "*.Version"):
remote_version=filename.replace('.Version','')
print('远程AND版本号为:'+remote_version)
#获取版本方式二
# # 执行命令 多个命令使用 ; 分号分隔
# stdin, stdout, stderr = ssh.exec_command('cd /AND;ls')
# # 结果放到stdout中,如果有错误将放到stderr中
# print(stdout.read().decode())
#获取本地AND版本号
from win32com.client import Dispatch
filename = r'C:\Users\xiangbin\PycharmProjects\pythonProject2\根据歌曲名称目录自动化批量下载歌曲\dist\getMusic\getMusic.exe'
parser = Dispatch("Scripting.FileSystemObject")
local_version = parser.GetFileVersion(filename)
print('本地AND版本号为:'+local_version)
int_local_version=int(local_version.replace('.',''))#去除点 1.0.0.0 转int
int_remote_version=int(remote_version.replace('.',''))#去除点 1.0.0.0 转int
# 实例化一个trans对象# 实例化一个transport对象
trans = paramiko.Transport(('39.106.155.202', 22))
# 建立连接
trans.connect(username='root', pkey=pkey)
# 实例化一个 sftp对象,指定连接的通道
sftp = paramiko.SFTPClient.from_transport(trans)
if int_local_version < int_remote_version:
print('有新的版本可以更新了!\n'+'更新当前版本'+local_version+"为:"+remote_version)
# 发送文件
print('发送文件')
sftp.put(localpath='11.txt', remotepath='/AND/1.txt')
else:
print('当前版本已经是最新版本了')
# 下载文件
print('下载文件')
#sftp.get('/AND/1.txt', '远程到本地.txt')
import stat
import datetime as dt
def getRemoteFiles(remoteDir,sftp):
# 加载sftp服务器文件对象(根目录)
filesAttr = sftp.listdir_attr(remoteDir)
try:
# foreach遍历
for fileAttr in filesAttr:
# 判断是否为目录
if stat.S_ISDIR(fileAttr.st_mode):
# 1.当是文件夹时
# 计算子文件夹在ftp服务器上的路径
son_remoteDir = remoteDir + '/' + fileAttr.filename
# 生成器, 迭代调用函数自身
yield from getRemoteFiles(son_remoteDir,sftp)
else:
# 2.当是文件时
# 生成器, 添加"路径+文件名"到迭代器"
yield remoteDir + '/' + fileAttr.filename
except Exception as e:
print('getAllFilePath exception:', e)
# 远程目录remoteDir文件下载保存到本地目录localDir
def download_file(remoteDir,localDir,sftp):
# 记录下载开始时间
dt_start = dt.datetime.now()
print('................. {} 开始下载!..................\n'.format(dt_start))
# 判断输入的本地目录是否存在
# if not os.path.exists(localDir):
# # 若本地目录不存在,则创建该目录
# os.makedirs(localDir)
# 实例化生成器, 获取sftp指定目录下的所有文件路径
files = getRemoteFiles(remoteDir,sftp)
print(files)
# foreach遍历
for file in files:
# 要下载的远程文件, 本地时路径+文件名
remoteFileName = file
###获取文件的全路径
get_son_remote_dir='/'.join(remoteFileName.split('/')[0:-1])
# 定义下载保存到本地时的路径+全路径+文件名
localFileName = os.path.join(localDir+get_son_remote_dir, file.split('/')[-1])
if not os.path.exists(localDir+get_son_remote_dir):
# 若本地目录不存在,则创建该目录
os.makedirs(localDir+get_son_remote_dir)
try:
# 下载文件, 本地已有同名文件则覆盖
sftp.get(remoteFileName, localFileName)
print('sftp服务器文件 {} 下载成功!\n该文件保存本地位置是 {} !\n'.format(
remoteFileName, localFileName))
except Exception as e:
print('%s下载出错!:\n' % (remoteFileName), e)
# 下载失败, 关闭连接
sftp.close()
# 下载成功, 关闭连接
# 记录下载结束时间
dt_end = dt.datetime.now()
print('..................... {} 下载完成!..................'.format(dt_end))
# 记录下载时长
dt_long = dt_end - dt_start
print('................ 本次下载共用时间 {} !...............\n'.format(dt_long))
if __name__ == '__main__':
# 远程目录remoteDir文件下载保存到本地目录localDir
download_file('/AND/docs','.', sftp)
# 移动文件夹
shutil.move("./AND/docs", ".")
# 删除文件夹及内容
shutil.rmtree("./AND")
# 最后关闭连接
ssh.close()
trans.close()
# python中对文件和文件夹进行移动、复制、删除、重命名,主要依赖os模块和shutil模块
# 要死记硬背这两个模块的方法还是比较困难的,可以用一个例子集中演示文件的移动、复制、删除、重命名,用到的时候直接查询就行。
#文件、文件夹的移动、复制、删除、重命名
#导入shutil模块和os模块
# import shutil,os
#
# #复制单个文件
# shutil.copy("C:\\a\\1.txt","C:\\b")
# #复制并重命名新文件
# shutil.copy("C:\\a\\2.txt","C:\\b\\121.txt")
# #复制整个目录(备份)
# shutil.copytree("C:\\a","C:\\b\\new_a")
#
# #删除文件
# os.unlink("C:\\b\\1.txt")
# os.unlink("C:\\b\\121.txt")
# #删除空文件夹
# try:
# os.rmdir("C:\\b\\new_a")
# except Exception as ex:
# print("错误信息:"+str(ex))#提示:错误信息,目录不是空的
# #删除文件夹及内容
# shutil.rmtree("C:\\b\\new_a")
#
# #移动文件
# shutil.move("C:\\a\\1.txt","C:\\b")
# #移动文件夹
# shutil.move("C:\\a\\c","C:\\b")
#
# #重命名文件
# shutil.move("C:\\a\\2.txt","C:\\a\\new2.txt")
# #重命名文件夹
# shutil.move("C:\\a\\d","C:\\a\\new_d")