2017-08-30 59 views
1
相对进口

我使用python 2:子包,并在PyCharm

python --version 
Python 2.7.13 :: Continuum Analytics, Inc. 

我有以下项目结构:

. 
└── foo 
    ├── bar1 
    │   ├── __init__.py 
    │   └── mod1.py 
    ├── bar2 
    │   ├── __init__.py 
    │   └── mod2.py 
    ├── __init__.py 
    └── start.py 

start.py

from foo.bar2.mod2 import mod2_f 
mod2_f() 

mod1.py

def mod1_f(): 
    print "mod1_f" 

mod2.py

from foo.bar1.mod1 import mod1_f 

def mod2_f(): 
    mod1_f() 
    print "mod2_f" 

如果我从IDE运行start.py事情工作正常。

但是使用这样的事情:

python ./foo/start.py 

结果

Traceback (most recent call last): 
    File "./foo/start.py", line 1, in <module> 
    from foo.bar2.mod2 import mod2_f 
ImportError: No module named foo.bar2.mod2 

现在,让我们说我改变进口

start.py

from bar2.mod2 import mod2_f 
mod2_f() 

MOD2 .py

from bar1.mod1 import mod1_f 

def mod2_f(): 
    mod1_f() 
    print "mod2_f" 

现在事情在命令行python ./foo/start 然而,PyCharm抱怨工作。为什么这些差异?

+0

好,我不使用Python 3,我使用python 2在时刻 – purpletentacle

+1

我会说这是预期的:它应该是'从bar2.mod2进口mod2_f' –

+0

我已经尝试过,并没有解决它.. – purpletentacle

回答

1

foo是包含一切,包括start.py

所以,当从start.py你这样做

from foo.bar2.mod2 import mod2_f 

蟒蛇寻找一个foo模块的目录(foo一个模块,因为它包含__init__.py) ,这在你的目录结构中太高了。我猜想它可以在IDE中使用,因为IDE会将每个模块目录添加到pythonpath中。但不从命令行它不。

简单的解决方法,因为bar2是在同一级别的目录为start.py

from bar2.mod2 import mod2_f 

注意from作品不同在Python 3见ImportError on python 3, worked fine on python 2.7,这可能就是PyCharm固定导入线时抱怨。您应该配置PyCharm所以它使用Python 2和Python的不是3为它工作,或者刚落from语法干脆做:

import bar2.mod2.mod2_f