Python 具有相对导入的Pyinstaller

Python 具有相对导入的Pyinstaller,python,pyinstaller,Python,Pyinstaller,我正在尝试使用Pyinstaller 2.1为Windows 7构建Pyinstaller。该模块使用相对导入,因为该包在Linux中通常作为“常规”Python包使用。有没有办法创建一个等级库文件来处理这种类型的设置?理想情况下,我希望有一个Python包,可以为Windows制作Pyinstaller exe,并在Linux/osx中有一个“常规”的pip可安装Python包 我在考虑可能使用隐藏导入或其他方法来实现这一点 我尝试使用默认的Pyinstaller设置,并将其指向我的“主”py

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

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

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

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

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

旁注:


理由是这个包需要numpy和scipy。是的,我知道有很好的方法可以让Anaconda等在Windows中运行。但是,由于遗留的原因,我现在只能使用exe设置。

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

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

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

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

但是,我后来添加了一个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

谢谢你发布这个!我正准备转换我所有的显式相对导入,但这太干净了。回答太棒了,我必须严格遵守。仅仅导入一个像
\uuuu main\uuuu
这样的模块是不够的,我必须在一个模块中创建一个
main()
函数,就像他所展示的那样,以便它工作。如果有人能解释为什么会出现这种情况,我不太清楚为什么要创建一个函数,但我怀疑这与PyInstaller如何在解释器下更改一些运行时信息以使事情正常工作有关。PyInstaller也使用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
来实现这一点,因此可能与
\uuuuuuuuuuuuuuu
\uuuu main\uuuuu
意味着只与Python解释器本身的
-m
标志一起工作,因此PyInstaller以不同的方式处理它。这可能会带来一些见解。
repo_dir/
    setup.py
    cli.py
    README.md
    package_a/
        main.py
        support_module.py
        __init__.py