【问题标题】:How can I convert a package to an exe using pyinstaller?如何使用 pyinstaller 将包转换为 exe?
【发布时间】: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


【解决方案1】:

虽然我认为这是完全合理的做法,但看起来 PyInstaller 根本不支持从包构建应用程序(使用 __main__.py)。

https://github.com/pyinstaller/pyinstaller/issues/2560

作为一种解决方法,您可以编写一个与您的__main__.py 执行相同操作的小存根(在包外)。然后将 PyInstaller 指向那里。

【讨论】:

  • 请注意,您可以简单地使用 __main__.py 作为 PyInstaller 的脚本,而不是添加另一个文件,并确保所有导入都是绝对的(而不是相对的)。这是 GitHub 上的 mentioned in a comment
【解决方案2】:

我想你忘记了“pyinstaller -w --onefile test.py”。你忘了'-w'。

【讨论】:

  • 嗨,贝克波尔。欢迎来到 StackOverflow!虽然您的解决方案可能会解决问题,但说明它解决问题的原因总是一个好主意。
  • 好的,下次我会注意的。
【解决方案3】:

首先安装pyinstaller

pip install pyinstaller 

要创建exe可执行文件夹,只需运行以下命令:

pyinstaller exam_browser.py

如果您想要单个带有徽标的 exe 文件,请运行以下命令:

pyinstaller exam_browser.py --onefile -F --icon logo.ico

【讨论】:

    猜你喜欢
    • 2016-08-03
    • 2020-12-05
    • 2021-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-28
    • 1970-01-01
    相关资源
    最近更新 更多