(1)python pyinstaller打包exe添加版本信息(2)python获取exe版本信息(3)pyqt5开发exe添加检查版本更新功能

 笔者总结不容易点个关注吧    一键三联哦!       感谢您!

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文件中的描述

(1)python pyinstaller打包exe添加版本信息(2)python获取exe版本信息(3)pyqt5开发exe添加检查版本更新功能_第1张图片

右键详细信息:

(1)python pyinstaller打包exe添加版本信息(2)python获取exe版本信息(3)pyqt5开发exe添加检查版本更新功能_第2张图片

python获取exe版本信息

(1)python pyinstaller打包exe添加版本信息(2)python获取exe版本信息(3)pyqt5开发exe添加检查版本更新功能_第3张图片

 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模块远程登录-阿里云开发者社区

这篇文章末尾中点击: 

(1)python pyinstaller打包exe添加版本信息(2)python获取exe版本信息(3)pyqt5开发exe添加检查版本更新功能_第4张图片

请现在阿里云控制台生成秘钥 然后再导出点pem文件格式的秘钥

(1)python pyinstaller打包exe添加版本信息(2)python获取exe版本信息(3)pyqt5开发exe添加检查版本更新功能_第5张图片

 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

(1)python pyinstaller打包exe添加版本信息(2)python获取exe版本信息(3)pyqt5开发exe添加检查版本更新功能_第6张图片

解决:

允许连接不在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(1)python pyinstaller打包exe添加版本信息(2)python获取exe版本信息(3)pyqt5开发exe添加检查版本更新功能_第7张图片

以上需要确保被访问的服务器对应用户.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:50

1   进入目录:

     命令:cd ~/.ssh

2拷贝一份公钥并命名为authorized_keys

   命令:cp id_rsa.pub authorized_keys

3下载文件到本地为私钥在py文件中使用

   命令: sz id_rsa

示意图:

(1)python pyinstaller打包exe添加版本信息(2)python获取exe版本信息(3)pyqt5开发exe添加检查版本更新功能_第8张图片


右键运行控制台打印输入

可以看到已经使用rsa非对称加密文件代替了阿里云登录ssh的密码进行了登录操作

列出了远程阿里云服务器的文件

(1)python pyinstaller打包exe添加版本信息(2)python获取exe版本信息(3)pyqt5开发exe添加检查版本更新功能_第9张图片

前方高能 上代码

功能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")

你可能感兴趣的:(已解决,python,windows,开发语言)