2014-02-26 80 views
0

假设我有一个文件夹结构,看起来像这样:蟒子文件夹导入混乱

. 
├── A 
│   ├── a.py 
│   └── b.py 
└── main.py 

的文件具有以下内容:

b.py:

class BClass: 
    pass 

a.py :

from b import BClass 

main.py:

from A import a 

如果我运行python3.3 A/a.pypython3.3 B/b.by,没有错误。但是,如果我跑python3.3 main.py,出现以下错误:

Traceback (most recent call last): 
    File "main.py", line 1, in <module> 
    from A import a 
    File "/tmp/python_imports/A/a.py", line 1, in <module> 
    from b import BClass 
ImportError: No module named 'b' 

改变进口线a.py到import A.b作品,但显然python3.3 A/a.py会失败呢。我实际上并不想运行python3.3 A/a.py,但我希望模块可以从多个位置导入。因此,a.py应该导入b.py,而不管a.py的输入位置。

如何解决此问题?

+0

制作包并使用绝对导入。请参阅http://blog.habnab.it/blog/2013/07/21/python-packages-and-you/以获得一个很好的介绍。 –

+1

你在'A'目录中有'__init __。py'吗? – Alfe

+1

'b.py'真的从自己导入('from b ...')还是错字? – Alfe

回答

2

而且我在评论中提及这是强制性的包__init__.py,你需要导入相对同级模块:

from .b import BClass 

那么它也可以在Python 3

或者,你可以的当然导入全名:

from A.b import BClass 

但是那么你的模块在你的包树中不能轻松地重定位。

但是,无论如何,您都可以将a.py作为独立使用。要做到这一点,你需要围绕import语句try/except和尝试的情况下,不同版本的第一个失败:

try: 
    from .b import BClass 
except ValueError: 
    from b import BClass 

但是,这是可以理解的。在一个更大的系统中,模块可能依赖于其他模块包中的某处,否则它们可能不应该是软件包的一部分,而是独立的。如果存在这种依赖关系,那么使用模块就好像它是独立的,当然会成为问题。

+0

使用'from.b导入BClass'适用于'python3.3 main.py',但运行'python3.3 A/a.py'则给出:'Traceback(最近的调用最后): 文件“A/a.py”,第1行,在 from .b导入BClass SystemError:父模块''未加载,无法执行相对导入'(对于那个奇怪的缩进!当我从另一个位置导入A时会受到伤害吗? –

+0

我添加了一个解释为什么这个问题存在,并提供了一个hacky的解决方法,使用'try' /'except'。 – Alfe

+0

谢谢,这听起来对我来说很合理。恐怕我必须想出另外一个问题:如果一个文件夹'B'包含一个'test.py'文件被添加到脚本中并且'test.py'包含'from..A导入a'这一行, 'python3.3 test.py'失败,与我在上面发布的完全相同的错误(“... Parent module''not loaded ...”)我有什么要将'test.py'中的导入更改为? –

1

A目录中,您需要一个__init__.py文件(空白将会很好)。否则,python将不会将其识别为一个包。

现在你是A是一个包,你应该使用绝对导入或显式相对导入。在这种情况下,在A/a.py中使用from A.b import BClassfrom .b import BClass

+0

我加了'__init __。py',但问题依然存在!它看起来像python实际上在'main.py'中导入'A',但是不能在'a.py'中导入'BClass'后面的文件。 –

+0

是的,现在你是A是一个包,你应该使用绝对导入或显式相对导入。在这种情况下,在A/a.py中使用'from A.b import BClass'或'from .b import BClass'。 – Menno

+0

非常感谢您的回复,我赞成。不过,我会和阿尔费的回答一起,因为他更加细致。 –