我正在使用py2exe捆绑python源代码。目录结构如下:
some_Mod.py
some_dir/another_dir/some_Mod.py
在后者内部some_dir / another_dir / some_Mod.py我试图用
导入其他Python模块from ..some_Mod import *
使用导入导致python解释器没有问题,但如果我在捆绑包中运行相同的星座,我会得到一个异常:
ImportError: No module named some_Mod
有人可以解释原因吗?
备注:重命名模块实际上没问题,但我只是想知道,为什么py2exe无法处理这个星座。
答案 0 :(得分:5)
如果每个子目录中都有__init__.py
个文件,则所有导入语句都应正常工作
假设这不是问题,这里是导入最佳实践的优秀指南:
http://blog.habnab.it/blog/2013/07/21/python-packages-and-you/
总之,永远不要使用相对导入 - 总是绝对的(请参阅上面的链接了解原因)。
第二个(我不完全确定原因),始终将py2exe setup.py脚本保存在主脚本所在的确切文件夹中。我已经尝试修改py2exe的'script'选项以允许我的脚本在其他地方......但你的确切问题发生在我身上。因此,请尝试确保它在主脚本所在的位置。
最后,你总能给py2exe一些帮助。我通常必须将根目录添加到系统路径,以便import语句有效。注意,我不是在我的应用程序代码的任何中修改sys.path
- 只是我用来构建exe的py2exe脚本。
在我的py2exe安装脚本的顶部:
import sys
sys.path.append(PATH_WHERE_PACKAGES_ARE)
# add any packages that need explicit importing here located in root directory:
import package1 # apparently it wasn't found...
import package2 # apparently same thing
通常我不会导入包,但通常将项目根添加到它们的位置就足够了。
答案 1 :(得分:0)
我现在不确定py2exe现在如何处理from ..some_Mod import *
语法,请检查这一点以确保some_Mod.py模块已正确打包:python -m py2exe.mf -d some_dir/another_dir/some_Mod.py
,如py2exe FAQ中所述