我正在尝试使用 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/