Pyinstaller与相对导入

时间:2014-03-17 15:03:32

标签: python pyinstaller

我正在尝试使用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设置。

1 个答案:

答案 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