python - 具有相关导入的 Pyinstaller

标签 python pyinstaller

我正在尝试使用 Pyinstaller 2.1 为 Windows 7 构建 Pyinstaller。该模块使用相对导入,因为该包通常在 Linux 中用作“常规”Python 包。有没有办法创建一个规范文件来处理这种类型的设置?理想情况下,我希望有一个 Python 包,我可以用它为 Windows 制作 Pyinstaller exe,并在 Linux/OS X 中有一个“常规”pip 可安装的 Python 包。

我正在考虑使用隐藏的导入或其他方法来实现这一点。

我已经尝试使用默认的 Pyinstaller 设置并将其指向我的“主”python 脚本。我从生成的 exe 中得到以下内容:

'尝试在非包中进行相对导入'

这是有道理的,因为我将 Pyinstaller 指向程序包中的 main.py 文件,而 Pyinstaller 并未获取我的整个程序包。这只是从命令行使用模块的起点。但是,您也可以导入它并在您自己的代码中使用它。

旁注:

原因是这个包需要 numpy 和 scipy。是的,我知道有很好的方法可以让这些在 Windows 中与 Anaconda 等一起工作。但是,由于遗留原因,我现在坚持使用 exe 设置。

最佳答案

我找不到让 Pyinstaller 执行此操作的方法。但是,我不认为这是 Pyinstaller 的错。这更多是我构建包的方式的问题。

我将一个脚本传递给 Pyinstaller,它是我的包的一部分。更好的方法是在包外提供一个简单的 Python 脚本,作为包的 cli 前端。

例如,考虑这样的包布局(假设文件使用相对导入):

repo_dir/
    setup.py
    README.md
    package_a/
        main.py
        support_module.py
        __init__.py

我之前的尝试是尝试通过将 main.py 传递给 Pyinstaller 来构建它。这导致了上述问题中提到的错误。

不过,我后来添加了一个 cli.py 脚本来执行如下操作:

from package_a.main import main
if __name__ == '__main__':
    main()

现在,我可以将 cli.py 传递给 Pyinstaller,并且我的显式相对导入仅在包内部使用。所以,这一切都有效。这是一个示例目录布局,仅供引用:

repo_dir/
    setup.py
    cli.py
    README.md
    package_a/
        main.py
        support_module.py
        __init__.py

关于python - 具有相关导入的 Pyinstaller,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22457809/

相关文章:

python - Pyinstaller 未构建,因为 USS.jtx 的权限被拒绝

python - 如何将基于 tkinter 的应用程序与自定义图标捆绑在一起?

python - 高级启动画面我如何在我的代码中使用它

PyCharm 上的 python3 导入问题

更改菜单标签时Python tkinter错误

python-3.x - PYODBC + PYINSTALLER : EXE listing different drivers as compiler (PyCharm), 32 位 Access 和 64 位 Python

python cx_Freeze egg问题

python - 为什么查询需要更多时间来执行。

python - assertListEqual 否定(相反)

python - PyInstaller "You may load I/O plugins with the ` skimage.io.use_plugin`"