学校提供Windows Server 2008R2的远程服务器,不能联网,安装python第一步直接fail……
换了python的版本也不行,试了半天,改用他法,就是这里的exe打包执行。
目录
1.新建虚拟环境
使用pycharm新建虚拟环境下的工程,我的在 D:\code\pythonlearnVir,当前目录下文件如下:
(savefile文件夹是个人加的,忽略。)
2.完成代码,生成项目依赖库
主文件名为main.py,查看项目依赖项,在Terminal中执行:
pip freeze > requirements.txt
3.安装 pyinstaller
在Terminal中执行:
pip install pyinstaller
成功后看一下:在Terminal中执行pyinstaller,会显示支持的语法:
4.打包指令
pyinstaller -D main.py,更多方法:
pyinstaller -D main.py # 打包成多个文件
# pyinstaller -F main.py # 打包成单个文件
# pyinstaller -F main.py -n newNameStr
# pyinstaller -D main.py -n newNameStr
成功后多出三个文件,其中:
(1)build是编译过程文件,可以删除;
(2)dist是编译完后文件,有用。包含exe可执行文件即main.exe,双击打开或通过终端打开;
(3)xxxx.spec是相关配置文件。
注意,双击打开exe可执行文件,如果程序有错则不显示而直接退出;可以选用通过终端打开方式,在cmd中,输入文件路径后打开,可提示可能的错误。
5.路径设置问题
代码中涉及到本地文件读写,我要用到该路径下文件:
D:\code\pythonlearnVir\savefile.demo.txt
给个例子,请这样写:
import os
import sys
flag=2 # 1: #针对单文件打包使用,2: # 针对多文件打包使用
if flag == 2:
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
else:
BASE_DIR = os.path.dirname(os.path.realpath(sys.argv[0])) # 待验
print(BASE_DIR)
with open(os.path.join(BASE_DIR,"savefile\demo.txt"),mode='r',encoding='utf-8') as f:
data=f.read().strip()
print(data)
6.自动导入模块问题
涉及到导入模块/函数/类,pyinstaller会自动打包所导入的依赖包,而且间接依赖的也会导进去, 没有被使用的则不导入。
如果遇到那种动态导入模块的代码时,却无法找到关联的包,可以修改spec后缀文件来说明,在spec文件“hiddenimports”处标记要使用的包(此处略)。
修改spec文件后,不能直接pyinstaller -D main.py命令打包,否则会覆盖已修改的spec文件。改用 pyinstaller -D main.spec方法来指定要使用的spec文件。
7.其他问题
上面做完,以为万事大吉时,在服务器上运行main.exe出错,可能是因为服务器系统太旧,提示:
Failed to execute script pyi_rth_multiprocessing
解决方法放在前一篇博文里