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

news2025/1/20 22:40:23

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

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:50

1   进入目录:

     命令: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")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/161264.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【bug】【vxe-table】设置固定列,表头后端返,样式错乱已解决

bug产生的原因以及解决的方法都很简单 但是要复现bug&#xff0c;就得把前因都铺垫清楚才行 一、前因 项目用的是vxe-table&#xff0c;并且封装成了组件&#xff0c;方便大量调用 并且column是后端动态返的&#xff0c;只需要绑定指定id给后端就行&#xff0c;大概就是这样&a…

npm ERR! Unexpected token ‘.‘ 报错解决办法

报错截图如下&#xff1a; 每次使用 nvm 将 node 切换到高版本后&#xff0c;运行 npm 相关的命令就报这个错&#xff0c;网上搜寻一番后&#xff0c;现将解决办法进行记录。 解决办法&#xff1a; 1、通过 nvm uninstall [version] 命令将已经安装的 node 版本依次删除。 [v…

CHAPTER 7 *使用Dockerfile创建镜像

dockerfile7.1 基本结构7.2 指令说明7.2.1 ARG7.2.2 FROM7.2.3 LABEL7.2.4 EXPOSE7.2.5 ENV7.2.6 ENTRYPOINT7.2.7 VOLUME7.2.8 USER7.2.9 WORKDIR7.2.10 ONBUILD7.2.11 STOPSIGNAL7.2.11 HEALTHCHECK7.2.12 SHELL7.2.13 RUN7.2.14 CMD7.2.15 ADD7.2.16 COPY7.3 创建镜像7.3.1 …

版本控制 | 设计师和美术人员的理想版本控制软件是?

版本控制对于开发人员来说是必不可少的工具。但今天&#xff0c;开发已经不仅仅包括代码。让美术人员和设计师使用版本控制能够集中协作&#xff0c;并保护宝贵的数字资产。 本篇文章将分析为什么版本控制对设计师也如此重要&#xff0c;并且回答一个重要的问题——对于设计师…

HTML实现闪电打字效果

演示 完整HTML <!doctype html> <html> <head> <meta charset"utf-8"> <title>H5 Canvas雷电打出文字特效</title><style> .page-thunder-to-text {position: relative;overflow: hidden; } .page-thunder-to-text canv…

每日坚果“鼻祖”,沃隆再闯IPO

成于坚果&#xff0c;困于坚果&#xff1f;“坚果大队长”沃隆再次闯关IPO。“每日坚果鼻祖”青岛沃隆食品股份有限公司&#xff08;下称“沃隆”&#xff09;于1月6日更新招股书&#xff0c;拟登陆上交所主板。沃隆是一家以坚果相关产品为核心的休闲食品生产商&#xff0c;主要…

SAP PP 生产版本主数据维护

PP生产版本主数据 生产版本&#xff08;Production Version&#xff09;主数据是执行生产业务过程中最主要的基础数据之一&#xff0c;包含了产品的数量结构信息&#xff0c;同时也包含了产品的工艺路线&#xff0c;工作中心等信息。生产版本主记录里包含了产品代码、工艺路线、…

三,Spring AOP

Spring AOP 1 代理设计模式 1.1 解决的问题 Service层中除了核心代码&#xff08;调用dao逻辑判断&#xff09;外&#xff0c;还有事务控制这种额外的增强功能。现在我们将核心业务代码和事务控制增强编码在一起直接定义在service层&#xff0c;日后还可能会新增其它的额外功…

docker安装与基本介绍使用

Docker 一、初识Docker 1、安装Docker # 1.yum包更新到最新 yum update # 2.安装需要的软件包&#xff0c;yum-util提供的yum-config-manager&#xff0c;例外两个是devicemapper驱动依赖的 yum install -y yum-utils device-mapper-persistent-data lvm2 # 3.设置yum源 yum…

hololens2开发环境配置,游戏引擎的全流程安装部署

要进行hololens 2的项目开发&#xff0c;进行基础环境搭建和软件安装部署的记录。 软件安装 UE ue2.6x(安装hololens平台)openxr插件&#xff0c;ux插件&#xff08;可选&#xff09; unity3d unity3d 2020&#xff08;unity3d 2021在打包时&#xff0c;在universal windo…

预测2023:智算中心将人工智能产业推上发展的“拐点”?

文|智能相对论作者|沈浪回顾过去的2022年&#xff0c;人工智能产业继续在巨变中迎来突破性成长。一方面&#xff0c;人工智能产业相关的应用越来越丰富、创新&#xff0c;比如元宇宙的出现和走红&#xff0c;为市场创造的一个全新的业态&#xff0c;也为用户带来了诸多新奇的体…

RabbitMQ 部署及配置详解

一、RabbitMQ 核心概念1. 生产者和消费者Producer: 消息的生产者,用于发布消息&#xff1b;Consumer: 消息的消费者&#xff0c;用于从队列中获取消息.消费者只需关注队列即可&#xff0c;不需要关注交换机和路由键。消费者可以通过basicConsume(订阅模式可以从队列中一直持续的…

【PCB专题】案例:PCB设计失误导致无法正常贴片

案例情况说明 本案例是新人画PCB的时候遇到的,但是遇到的时间已经比较晚了,在生产的时候报的异常。一部分原因也是前期我没有审查出来这个问题。 要生产的时候,工厂报了异常。新人转给我看的时候,我才发现PCB上是没有设计MARK点。这将导致SMT时没有Mark点对位,需要看看有没…

一篇搞定JS的位运算(公式+力扣真题)--- 持续更新

摘要 位操作&#xff08;Bit Manipulation&#xff09;是程序设计中对位模式或二进制数的一元和二元操作。在许多古老的微处理器上&#xff0c;位运算比加减运算略快&#xff0c;通常位运算比乘除法运算要快很多。在现代编程语言中&#xff0c;情况并非如此&#xff0c;很多编程…

Java项目:酒店管理系统(java+SSM+jsp+mysql+maven)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 主要技术:java springmvc mybatis mysql tomcat js jauery jsp log4j等一些常见基本技术适用于Java毕设和学习使用 主要实现&#xff1a; 前台&#xff1a;登录、注册、酒店信息浏览、搜索酒店信息、查看房…

游戏开发 帧同步

帧同步技术是一个古老的技术&#xff0c;没有特别固定的招式&#xff0c;优化方向也是根据实际情况各有不同&#xff0c;但是其核心思想都是一样的。1.为什么需要帧同步技术帧同步主要是为了保证某些类型的游戏在同步时&#xff0c;可以保证很好的游戏体验。游戏类型通常包括&a…

无线wifi的参数即含义

WiFi属性信息 参考&#xff1a;WiFi发展史&#xff1a;https://zhuanlan.zhihu.com/p/74348591&#xff0c;WiFi2.4和5G简述&#xff1a;https://zhuanlan.zhihu.com/p/344652613 下面图中的WiFi4和WiFi5是根据协议的另一个名字。&#xff08;图片来自参考链接&#xff09; …

vue3 antd项目实战——Modal弹窗自定义遮罩 (利用maskStyle属性自定义遮罩样式)

vue3 antd项目实战——Modal弹窗自定义遮罩 maskStyle知识回调场景复现关于mask遮罩的API属性利用maskStyle属性自定义遮罩样式知识回调 文章内容文章链接vue3 antd ts实战——ant-design-vue组件库引入https://blog.csdn.net/XSL_HR/article/details/127396384?spm1001.2014…

随手查——Multisim

关于电路仿真软件Multisim的一些记录&#xff0c;基于Multisim14.0。 Multisim1、Multisim中元器件的颜色2、快速创建一个放大器电路3、如何进行参数扫描&#x1f680;参数扫描数据点导出为Excel&#x1f680;退出参数扫描模式4、交流分析1、Multisim中元器件的颜色 Multisim中…

YOLOV8 | 最先进的 YOLO 模型训练自己的数据集(持续更新中)

本文实现了俩种环境的设置&#xff0c;一种是windows的CPU版本&#xff0c;还有服务器上的GPU版本。CPU版本仅用来实现检测&#xff0c;而GPU版本用来训练自己的数据集&#xff01;&#xff08;选择其中一个环境运行后&#xff0c;训练自己的数据集&#xff09;1.环境1&#xf…