我有一个在 Nix 上开发的小型 Python 应用程序,我希望分发给一些 M$ Windows 用户。似乎可执行的 Python zip archive 是实现此目的的绝佳方法。
但是,我想包含标准 Python 安装中不包含的依赖项,例如术语颜色。这可能吗?
这是我正在测试的应用程序
from termcolor import cprint
print('hello world')
cprint('hola mundo', 'red')
和 termcolor 不包含在标准 Python 实现中。我不希望用户 pip install.
我已经使用
构建了一个 .pyz python -m zipapp . -o my_app.pyz
应用程序已创建,它可以在安装了 termcolor 的 virtualenv 中运行。但如果不是,当然会失败。
我也试过了
python -m zipapps my_app -o my_app.pyz -r requirements.txt
这会创建一个包含 termcolor 的 .pyz,但是当我运行它时,它会落入 Python REPL
这可能吗?
--main
选项。最好先创建一个 main 函数。
my_app.py
from termcolor import cprint
def my_main():
print('hello world')
cprint('hola mundo', 'red')
if __name__ == '__main__':
my_main()
然后用类似的东西打包:
mkdir build
mkdir dist
python -m pip install termcolor --target build
cp my_app.py build
python -m zipapp build --main my_app:my_main --output dist/my_app.pyz
最后可以运行:
python dist/my_app.pyz
并且这个
.pyz
文件可以移动到任何地方(在同一台机器上)并且它将继续工作,因为它包含依赖项(不需要虚拟环境)。如果依赖项只是纯 Python(就像 termcolor 的情况一样),那么.pyz
文件可以与其他 Python 解释器版本和其他操作系统一起使用。
您还可以选择使用--python
选项
设置shebang。
将标准 Python 安装中未包含的依赖项包含到 Python zip 存档中是一个完全合理的壮举。这可以通过 PyInstaller 或 cx_Freeze 等工具来实现,它们都能够生成包含所有必要依赖项的独立可执行文件。
利用 PyInstaller 或 cx_Freeze 的强大功能的第一步是制作一个 requirements.txt 文件,它本质上是应用程序所需的所有依赖项的概要,包括 termcolor。这可以手动生成,也可以借助 pipreqs 等工具自动生成,该工具会搜索代码的导入语句以识别所需的依赖项。
requirements.txt 文件创建成功后,下一步是使用 PyInstaller 或 cx_Freeze 生成可执行文件。这两种工具都提供了指定需求文件的能力,从而允许自动下载所有必需的包并将其包含在可执行文件中。
这是一个使用 PyInstaller 创建可执行文件的示例命令:
pyinstaller --onefile --add-data "path/to/requirements.txt;." myscript.py
执行此命令后,将在 dist 文件夹中创建一个单独的可执行文件,其中包含您的 Python 脚本 (myscript.py) 和 requirements.txt 文件。在 Windows 机器上执行后,可执行文件将自动安装所需的依赖项并执行您的脚本。
同样,这是一个使用 cx_Freeze 创建可执行文件的示例命令:
cxfreeze myscript.py --include-path=path/to/requirements.txt
执行此命令将生成一个可执行文件,位于构建文件夹中,其中包括您的 Python 脚本和 requirements.txt 文件中规定的所需依赖项。
请注意,PyInstaller 和 cx_Freeze 提供了额外的选项和设置,可用于根据您的需要定制可执行文件的行为。建议仔细阅读每个工具的文档,以更深入地了解它们的功能。