Python项目打包流程
Using PyInstaller to Easily Distribute Python Applications
pip install pyinstaller
pyinstaller -F xx.py
Pyinstaller使用注意事项
- 避免在
入口文件
中使用显式的相对导入,相对导入的语法取决于当前位置以及要导入的模块,包或对象的位置。以下是相对导入的一些示例:
from .some_module import some_class from ..some_package import some_function from . import some_class
单点表示所引用的模块或软件包与当前位置位于同一目录中。两个点表示它位于当前位置的父目录(即上面的目录)中。三个点表示该文件位于祖父母目录中,依此类推。
-
Pyinstaller运行时会产生三个文件夹:
-
A
*.spec
file -
A
build/
folder -
A
dist/
folder- Spec File
该文件将由
pyinstaller
命令自动创建。可以修改此文件并在以后重新使用它来创建可执行文件。通过提供此spec文件而不是pyinstaller
命令的入口点脚本,可以使以后的构建更快一些。官网用例,但是,对于简单的项目,除非您想大量自定义项目的构建方式,否则无需担心这些细节。 -
Build Folder
在该
build/
文件夹中,PyInstaller会将大多数元数据和内部簿记放入该文件夹中,以构建可执行文件。默认内容如下所示:build/ | └── cli/ ├── Analysis-00.toc ├── base_library.zip ├── COLLECT-00.toc ├── EXE-00.toc ├── PKG-00.pkg ├── PKG-00.toc ├── PYZ-00.pyz ├── PYZ-00.toc ├── warn-cli.txt └── xref-cli.html
build文件夹对于调试很有用,但是除非遇到问题,否则在很大程度上可以忽略此文件夹。
-
Dist Folder
构建后,将得到一个
dist/
类似于以下内容的文件夹:dist/ | └── cli/ └── cli
该
dist/
文件夹包含要交付给用户的最终工件。在该dist/
文件夹内,有一个以入口点命名的文件夹。因此,在此示例中,您将拥有一个dist/cli
文件夹,其中包含我们应用程序的所有依赖关系和可执行文件。要运行的可执行文件为,dist/cli/cli
或者dist/cli/cli.exe
如果您使用的是Windows。还可以找到大量的文件扩展名为
.so
,.pyd
以及.dll
根据您的操作系统。这些是共享库,表示PyInstaller创建和收集的项目的依赖项。Note: You can add *.spec, build/, and dist/ to your .gitignore file to keep git status clean if you’re using git for version control. The default GitHub gitignore file for Python projects already does this for you.
- Spec File
- Pyinstaller自定义参数
--name
更改可执行文件的名称
“`
pyinstaller cli.py –name realpython
“`-
--onefile
将整个应用程序打包到一个可执行文件中
“`
pyinstaller cli.py –onefile
“`使用上面的命令,
dist/
文件夹将只包含一个可执行文件,而不是所有依赖关系都位于单独文件中的文件夹。 -
--hidden-import
列出PyInstaller无法自动检测到的多个顶级导入
这是使用
import
内部函数和来解决代码的一种方法__import__()
。您也可以在同一命令中多次使用--hidden-import
。此选项需要您要包含在可执行文件中的软件包的名称。例如,如果您的项目将requests库导入到函数内部,则PyInstaller不会自动包含
requests
在可执行文件中。您可以使用以下命令强制requests
将其包括在内:“`
pyinstaller cli.py –hiddenimport=requests
“`您可以在构建命令中多次指定此选项,每次隐藏导入一次。
-
--add-data
和--add-binary
指示PyInstaller将其他数据或二进制文件插入到您的版本中。
当您希望捆绑配置文件,示例或其他非代码数据时,此功能很有用。
-
--exclude-module
从可执行文件中排除某些模块
例如,如果使用pytest,则可能要从可执行文件中排除它:
“`
pyinstaller cli.py –exclude-module=pytest
“` -
-w
避免自动打开控制台窗口进行
stdout
日志记录。仅在构建支持GUI的应用程序时,此功能才有用。通过允许用户从不查看终端,这可以帮助您隐藏实现的详细信息。
类似于该
--onefile
选项,-w
不带任何参数:“`
pyinstaller cli.py -w
“` -
--log-level=DEBUG
重建可执行文件并查看输出
当使用来增加详细程度时,PyInstaller将创建大量输出
--log-level=DEBUG
。将输出保存到以后可以参考的文件中很有用,而不是在终端中滚动。为此,您可以使用外壳程序的重定向功能。这是一个例子:“`shell
$ pyinstaller –log-level=DEBUG cli.py 2> build.txt
“`使用的标准重定向
>
是不够的。PyInstaller打印到stderr
流,而不是stdout
。这意味着您需要将stderr
流重定向到文件,可以使用上一个2
命令中的as来完成。
-
Pyinstaller加密打包
加密过程需要依赖
pycrypto
pip install pycrypto
只要在打包时加个
key
参数就能加密:pyinstaller.exe -F --key 123456 xxx.py
发表回复