【发布时间】:2017-06-03 13:37:37
【问题描述】:
我有一个开源 python 命令行程序,可以在 Python 2.7、Python3+ 上运行,并且是跨平台的。
我正在尝试更轻松地将它打包为我的 Windows 用户的可执行文件。这个包的源代码在 Github 上:https://github.com/stormpath/stormpath-cli
我正在尝试使用 pyinstaller 打包我的 Python 程序,但遇到了问题。
我正在 Windows 8 机器上运行以下命令:
$ pyinstaller --onefile setup.py
这成功为我生成了一个EXE文件,但是当我去运行它时,我得到了以下错误:
Traceback (most recent call last):
File "setup.py", line 4, in <module>
File "c:\python27\Lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 389, in load_module
exec(bytecode, module.__dict__)
File "site-packages\setuptools\__init__.py", line 160, in <module>
File "site-packages\setuptools\monkey.py", line 93, in patch_all
File "site-packages\setuptools\monkey.py", line 145, in patch_for_msvc_specialized_compiler
File "importlib\__init__.py", line 37, in import_module
ImportError: No module named msvc
Failed to execute script setup
出于测试目的,为了帮助缩小问题范围,我创建了一个 test.py 脚本,其中包含以下代码:
print('hello, world!')
然后将其打包成一个exe:
$ pyinstaller --onefile test.py
当我运行这个生成的 exe 时,一切正常! Hello world 按预期输出。
我相信发生的事情是我没有告诉 pyinstaller 如何正确“检测”我的项目是一个 python 包,而不是单个文件脚本。
我已经阅读了很多文档,并在谷歌上搜索过,但还没有找到一种方法来指定一个包供 pyinstaller 分析。
我错过了什么?
【问题讨论】:
-
我认为您不应该指向 setuptools 脚本。这只是为了安装它,你应该指向模块stormpath-cli。
main.py可能需要重命名为__main__.py我相信这个问题即将出现,因为 setuptools 会执行一些动态系统特定的东西,并且当它被捆绑时它无法正确访问它...... -
是的,我同意。我认为这是问题所在。只是不确定我应该指向什么:o 它如何知道如何在没有安装脚本的情况下将脚本安装到正确的位置? oO
-
不会的,创建的exe就是正常运行的程序。当你运行它时,它不会安装,它只会执行stormpath-cli。 IE。一个多合一的便携式应用程序。我认为这样做要容易得多,然后将该 exe 捆绑在安装程序中。 (这实际上可能只是一个批处理文件,将其添加到路径中,将其移动到正确的程序目录等)我不认为 setuptools 曾经打算从冻结的环境中运行并且没有进入它我可以想象有一个那里有很多问题。我认为 setuptools 会检查 python 路径是否是只读的。
-
PyInstaller 用于将“Python 应用程序及其所有依赖项安装到单个包中”,而不是用于安装 Python 包。你需要使用其他东西,比如
distutils包,来做到这一点。 -
@martineau Python 包可以是应用程序——只需添加
__main__.py,现在您就可以“运行”一个包了。
标签: python windows python-2.7 pyinstaller software-packaging