1.1.打包方式:
1)你可以直接在控制台运行,不太方便。
2).在程序中运行推荐。见下面例程
3) 打包文件为xx.py或xx.spec都可以,建议用xx.py方便修改。或者打包后不满意在打开xx.spec做局部修改也可。
1.2.注意:
安装最好用conda安装,最好不要用pycharm之类的平台
路径注意事项见下文
==================================================================================
2.1.路径
print('1. hello start...')
import os,sys,time
def app_path():
"""
返回一个程序的执行路径;源代码中使用路径时,以app_path()的返回值作为基准路径,其它路径都是其相对路径
官网:https://pyinstaller.readthedocs.io/en/stable/usage.html
"""
if hasattr(sys, 'frozen'):#判断目前是否是直接执行
# Handles PyInstaller
print('1.exe目录:sys.executable=', sys.executable)
print('2.exe目录:os.path.dirname=', sys.executable)
return os.path.dirname(sys.executable)#使用pyinstaller打包后的exe目录
# sys.executable='C:\\ProgramData\\Anaconda3\\python.exe' 获取可执行文件路径
# os.path.dirname='C:\\ProgramData\\Anaconda3'
else:
print('3.py目录:os.path.dirname(__file__)=',os.path.dirname(__file__) )
return os.path.dirname(__file__) #没打包前的py目录
def savelog(file,log):
dirname = os.path.dirname(file)#返回文件脚本的路径
if not os.path.exists(dirname):
os.mkdir(dirname)#创建目录
with open(file,'a',encoding='utf-8') as f:
f.write(log+'\n')
if __name__=='__main__':
file = app_path()+r'\log\2.txt'
print('4.file=',file)
savelog(file,'hello you')
savelog(file,'文件路径%s' %(file))
time.sleep(5)
2.2.获取系统路径方法:D:\PycharmProjects\test_py36\hello.py
import os,sys
print('1=',sys.path[0])
print('2=',sys.argv[0])
print('3=',os.path.dirname(os.path.realpath(sys.executable)))
print('4=',os.path.dirname(os.path.realpath(sys.argv[0])))
print('5=',__file__)
print('6=',os.path.realpath(__file__))
#pycharm平台运行
# 1= D:\PycharmProjects\test_py36
# 2= D:/PycharmProjects/test_py36/hello.py
# 3= C:\ProgramData\Anaconda3
# 4= D:\PycharmProjects\test_py36
# 5= D:/PycharmProjects/test_py36/hello.py
# 6= D:\PycharmProjects\test_py36\hello.py
#exe运行
# F:\dist\hello>hello
# 1= F:\dist\hello\base_library.zip
# 2= hello
# 3= F:\dist\hello
# 4= F:\dist\hello
# 5= hello.py
# 6= F:\dist\hello\hello.py
3.调用Python文件与打包文件不在一个文件夹:
import sys
sys.path.append(r'D:\PycharmProjects\test_py36')
import hello#hello.py
# 调用hello.py里面函数:
hello.Ui_Dialog().setupUi(dlg)
# 打包时将hello.py所在文件夹放在pyinstaller打包语句中:
pyinstaller -D -w %name% -p "D:\\PycharmProjects\\test_py36"
================================================================
4.打包方式
# -*- coding: utf-8 -*-
import os
from PyInstaller.__main__ import run
def compile_exe_first(filename):
if __name__ == '__main__':
opts =[ '-D','-c',
# 直接导入数据图片不会被压缩(应将资源转为.dll或二进制文件)
'--add-binary=D:/PycharmProjects/test_py36/resource/picture/*.jpg;resource/picture',
'--add-binary=D:/PycharmProjects/test_py36/resource/icon/*.ico;resource/icon', #导入图片.dll文件
# '--add-binary= D:/PycharmProjects/test_py36/upx/upx.exe;./', #导入.exe文件
r'--add-data=D:\PycharmProjects\test_py36\data\tcy.txt;resource\data', #导入数据文件
r'--add-data=D:\PycharmProjects\test_py36\data\fun.htm;resource\data', #导入数据文件
# '--hidden -import = shutil.grp',
#修改你要附件的路径
'--paths=D:\\PycharmProjects\\test_py36',
'--paths=D:\\PycharmProjects\\test_py36\\upx',
'--paths=D:\\PycharmProjects\\test_py36\\resource\\picture',
'--paths=D:\\PycharmProjects\\test_py36\\resource\\icon',
'--paths=C:\\ProgramData\\Anaconda3\\Library\\plugins\\PyQt5',
'--paths=C:\\ProgramData\\Anaconda3\\Library\\bin',
'--paths=C:\\ProgramData\\Anaconda3\\Lib\\site-packages\\PyQt5',
'--paths=C:\\ProgramData\\Anaconda3\\Lib\\site-packages',
'--icon', 'D:/PycharmProjects/test_py36/resource/icon/icon.ico',
'--clean', #'--noupx', '--upx-dir=./',
filename #pyqt5_test.spec
]
run(opts)
filename='client.py' #pyqt5_test.spec
compile_exe_first(filename)
说明:
安装pyinstaller:最好从Anaconda Navigator平台安装 pyinstaller3.4,不要从pycharm中安装
版本:pyinstaller3.4,python3.6.5
注意:路径中不要有中文,使用相对路径
# 4.2.pyinstaller打包方式2:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#以上必须包含
import os
def compile_exe(py_path,pyinstaller_path):
"""
:param py_path: 获取需要转换的.py格式文件位置
:param pyinstaller_path: 指定pyinstaller.exe位置
:return: None
说明:此种方式本打包开始执行文件开头必须加# -*- coding: utf-8 -*-
"""
file_path = py_path.rpartition('\\')[0] + '\\'# 转换后文件的放置目录
print(file_path)
# 指定三个选项的文件路径
dist_path = file_path + 'dist'
build_path = file_path + 'build'
spec_path = file_path
# 选项
options = ' -D' +r' --add-data=' \
r'D:\PycharmProjects\test_py36\resource\picture\girl.jpg;resource\picture' +\
' --distpath ' + dist_path +\
' --workpath ' + build_path + \
' --specpath ' + spec_path + ' '
# 调用系统命令
os.system('python ' + pyinstaller_path + options + py_path)
def test_compile_exe():
py_path=r'D:\PycharmProjects\test_py36\pyqt5_test.py'
pyinstaller_path=r'C:\ProgramData\Anaconda3\Scripts\pyinstaller-script.py'
compile_exe(py_path,pyinstaller_path)
# test_compile_exe()
==================================================================================
5.pyinstaller命令的语法:
pyinstaller [-h] [-v] [-D] [-F] [--specpath DIR] [-n NAME]#【-h显示帮助信息】【-v显示版本】
[--add-data <SRC;DEST or SRC:DEST>]
[--add-binary <SRC;DEST or SRC:DEST>] [-p DIR]
[--hidden-import MODULENAME]
[--additional-hooks-dir HOOKSPATH]
[--runtime-hook RUNTIME_HOOKS] [--exclude-module EXCLUDES]
[--key KEY] [-d [{all,imports,bootloader,noarchive}]] [-s]
[--noupx] [-c] [-w]
[-i <FILE.ico or FILE.exe,ID or FILE.icns>]
[--version-file FILE] [-m <FILE or XML>] [-r RESOURCE]
[--uac-admin] [--uac-uiaccess] [--win-private-assemblies]
[--win-no-prefer-redirects]
[--osx-bundle-identifier BUNDLE_IDENTIFIER]
[--runtime-tmpdir PATH] [--bootloader-ignore-signals]
[--distpath DIR] [--workpath WORKPATH] [-y]#【文件exe存放目录】【临时工作文件】
[--upx-dir UPX_DIR] [-a] [--clean] [--log-level LEVEL]
scriptname [scriptname ...]#文件名.py
1.1.常规选项
-h, --help 显示此帮助消息并退出
-v, --version 显示程序版本信息并退出。
--distpath DIR 生成可执行文件exe存放目录(默认:./dist)
--workpath WORKPATH 临时工作文件目录,.log,.pyz等(默认值:./build)
-y, --noconfirm 替换输出目录(默认值:SPECPATH/dist/SPECNAME)而不要求确认
--upx-dir UPX_DIR UPX实用程序的路径(默认:搜索执行路径)
-X, –-upx 如果有UPX安装(执行Configure.py时检测),会压缩执行文件(Windows系统中的DLL也会)(压缩包下载:https://github.com/upx/upx/releases/tag/v3.95
-a, --ascii 不包括unicode编码支持(默认支持)
--clean 在构建之前清理PyInstaller缓存并删除临时文件(build文件夹下)
--log-level LEVEL 构建时控制台消息中的详细信息量。
LEVEL可能是DEBUG,INFO,WARN,ERROR,CRITICAL(默认值:INFO)之一。
1.2.要生成什么
-D, --onedir 创建包含可执行文件的单文件夹包(默认)
-F, --onefile 生成单独exe文件
--specpath DIR 存储生成spec文件文件夹(默认:当前目录)
-n NAME, --name NAME 可选(产生spec)名字(默认:第一个脚本的基本名称)
1.3.捆绑什么,在哪里搜索
--add-data <SRC;DEST or SRC:DEST> #导入.txt等数据文件;windows用分号分割
--add-binary <SRC;DEST or SRC:DEST>#导入图片.dll等二进制资源
参考:https://blog.csdn.net/weixin_43049973/article/details/82725699
-p DIR, --paths DIR 搜索导入路径;允许多路径,以“;or :”分隔,或多次使用此选项
--hidden-import MODULENAME, --hiddenimport MODULENAME
命名在脚本代码中不可见的导入。此选项可以多次使用。
--additional-hooks-dir HOOKSPATH
搜索钩子的另一个路径。此选项可以多次使用。
--runtime-hook RUNTIME_HOOKS
自定义运行时挂接文件的路径。运行时挂钩是与可执行文件捆绑在一起的代码,
在任何其他代码或模块之前执行,以设置运行时环境的特殊功能。此选项可以多次使用。
--exclude-module EXCLUDES
可选模块或包(他的Python名称,而不是路径名)将被忽略(好像没有找到)。此选项可以多次使用。
--key KEY 用于加密Python字节码的密钥。
1.4.如何生成
-d, --debug 编译为debug模式,获取运行中日志信息,查看编译错误。
在初始化和启动捆绑的应用程序时,告诉引导加载程序发出进度消息。用于诊断丢失导入的问题。
-s, --strip 将符号表条应用于可执行文件和共享库(不推荐用于Windows)
--noupx 不用UPX压缩(Windows和* nix之间的工作方式不同)
1.5.Windows和Mac OS X特定选项
-c, --console, --nowindowed 打开标准控制台窗口(默认)
-w, --windowed, --noconsole 无控制台窗口(不指定会带dos窗口)
-i <FILE.ico or FILE.exe,ID or FILE.icns>, #-i manage.ico,ico格式,指定图标路径
--icon <FILE.ico or FILE.exe,ID or FILE.icns>
FILE.ico:将该图标应用于Windows可执行文件。
FILE.exe,ID,从exe中提取带有ID的图标。
FILE.icns:将图标应用于Mac OS X上的.app包
实例:-icon=<FILE.EXE,N> 将file.exe的第n个图标添加为可执行文件的资源
1.6.Windows特定选项
--version-file FILE 从FILE添加版本资源到exe
-m <FILE or XML>, --manifest <FILE or XML> 将清单FILE或XML添加到exe
-r RESOURCE, --resource RESOURCE 将资源添加或更新到Windows可执行文件。可以多次使用
RESOURCE是一到四个项目,FILE [,TYPE [,NAME [,LANGUAGE]]]。
FILE可是数据文件或exe/dll。对于数据文件,必须至少指定TYPE和NAME。
LANGUAGE默认为0或可以指定为通配符*以更新给定TYPE和NAME的所有资源。
exe/dll文件如省略TYPE,NAME和LANGUAGE或将其指定为通配符*,则将FILE中的所有资源添加/更新到最终可执行文件。
--uac-admin 使用此选项会创建一个Manifest,它将在应用程序重新启动时请求提升。
--uac-uiaccess 使用此选项可以使提升的应用程序与远程桌面一起使用。
1.7.Windows并排程序集搜索选项(高级)
--win-private-assemblies
捆绑到应用程序中的任何共享程序集都将更改为专用程序集。这意味着将始终使用这些程序集的确切版本,
并且将忽略系统级别的用户计算机上安装的任何较新版本。
--win-no-prefer-redirects
在搜索要捆绑到应用程序中的共享或专用程序集时,PyInstaller不希望遵循重定向到较新版本的策略,
并会尝试捆绑程序集的确切版本。
1.8.Rarely used special options:
--runtime-tmpdir PATH
Where to extract libraries and support files in
`onefile`-mode. If this option is given, the
bootloader will ignore any temp-folder location
defined by the run-time OS. The ``_MEIxxxxxx``-folder
will be created here. Please use this option only if
you know what you are doing.
实例:windows
pyinstaller -h 显示帮助信息
pyinstaller -c xxxx.py
pyinstaller xxxx.py --console
pyinstaller.exe -F -w D:\PycharmProjects\test_py36\build\pyqt5_test\pyqt5_test.py
pyinstaller -F -i manage.ico yourpyfile.py --hidden-import PyQt5.sip#屏蔽掉子包
pyinstaller -D -w -p D:\PycharmProjects\test_py36;D:\PycharmProjects\test_py36\picture;\
C:\ProgramData\Anaconda3\lib\site-packages; \
-i D:\PycharmProjects\test_py36\picture\icon.ico pyqt5_test.py
pyinstaller -D --add-data gril.jpg -p D:\PycharmProjects\test_py36;\
D:\PycharmProjects\test_py36\picture -w pyqt5_test.py
pyinstaller --noconfirm --log-level = WARN ^
--onefile --nowindow ^
--hidden-import = secret1 ^
--hidden-import = secret2 ^
--icon = .. \ MLNMFLCN.ICO ^
myscript.spec
D:\pythonWork\baiduai>pyinstaller -F machine1.py --hidden-import \
--hidden-import email.mime.image