2017-08-30 57 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