2011-04-27 66 views
2

我使用py2exe捆绑python源代码。目录结构如下:py2exe无法从其他目录导入模块

some_Mod.py 
some_dir/another_dir/some_Mod.py 

里面后者some_dir/another_dir/some_Mod.py我试图用

from ..some_Mod import * 

使用进口导入其他Python模块会与蟒蛇没有问题口译员,但如果我在捆绑包中运行相同的星座,我会得到一个例外:

ImportError: No module named some_Mod 

有人可以解释为什么吗?

备注:重命名模块实际上没有问题,但我只是想知道,为什么py2exe不能处理这个星座。

回答

4

解释的。如果你在每个__init__.py文件那些子目录,那么所有的导入语句应该正常工作。
假设这是没有问题的,这里是一个很好的指南,导入最佳做法:

http://blog.habnab.it/blog/2013/07/21/python-packages-and-you/

总之,千万不要用相对导入 - 总是绝对的(见上为什么链接)。

其次(我不完全确定为什么),请始终将您的py2exe setup.py脚本保存在主脚本所在的确切文件夹中。我已经尝试修改py2exe的'脚本'选项,以允许我的脚本在别的地方......但是确切的问题发生在我身上。所以,请确保它正确的位置在主要脚本的位置。

最后,你总是可以给py2exe一点帮助。我通常必须将根目录添加到系统路径,以便导入语句有效。请注意,我不会修改sys.path任何我的应用程序的代码 - 只有py2exe脚本我用来构建exe。

在我的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 

一般来说,我不导入包,增加项目的根在那里他们通常存在就足够了。

+0

尽管“谢谢”不鼓励......我一直在与这种场景打交道几年,现在已经提供了一个可行的解决方案。所以谢谢! – S3DEV 2017-12-11 13:27:52

0

我不知道现在py2exe如何处理from ..some_Mod import *语法,请在此以确保some_Mod.py模块是否正确打包:python -m py2exe.mf -d some_dir/another_dir/some_Mod.py作为py2exe FAQ

+0

根据http://www.py2exe.org/index.cgi/News py2exe应导入相对导入。 – Bertolt 2011-04-27 13:25:54

+0

好吧,是生成的library.zip中存在的模块some_Mod.py? – 2011-04-27 13:38:10

+0

两个模块都存在。我打开了由py2exe创建的library.zip,它包含相同的目录结构。 – Bertolt 2011-04-27 13:48:45