我正在尝试使用Pyinstaller 2.1为Windows 7制作Pyinstaller版本。该模块使用相对导入,因为该包通常在Linux中用作“常规”Python包。有没有办法创建一个spec文件来处理这种类型的设置?理想情况下,我希望有一个Python包,我可以为Windows创建一个Pyinstaller exe,并在Linux / OS X中有一个“常规”的可安装pip的Python包。
我在考虑使用隐藏的导入或其他东西来实现这一点。
我尝试使用默认的Pyinstaller设置并将其指向我的'main'python脚本。我从生成的exe中得到以下内容:
'尝试非包装中的相对导入'
这是有道理的,因为我将Pyinstaller指向包中的main.py文件而Pyinstaller没有拿起我的整个包。这只是从命令行使用模块的起点。但是,您可以导入它并在您自己的代码中使用它。
旁注:
原因是这个包需要numpy和scipy。是的,我知道有很好的方法可以在Windows中使用Anaconda等工作。但是,由于遗留原因,我现在仍然坚持使用exe设置。
答案 0 :(得分:6)
我找不到让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