2016-08-18 79 views
0

這個問題被問了很多次,但沒有一個解決方案似乎對我的情況有所幫助。Python3導入問題

我有這樣

my_project/ 
    main.py 
    bootstrap/ 
     __init__.py 
     boot.py 
    consumer/ 
     __init__.py 
     main.py 

的目錄結構是在頂層目錄(myproject)和執行python3 consumer/main.py拋出一個錯誤:

Traceback (most recent call last): 
    File "consumer/main.py", line 7, in <module> 
    from bootstrap.boot import MyClass 
ImportError: No module named 'bootstrap' 

奇怪的是,進口使用解釋器模塊按預期工作。從PyCharm運行代碼也可以正常工作。

我試過用「完整路徑」例如from my_project.bootstrap.boot import MyClass,與ImportError相同。我也嘗試使用相對輸入,例如from .bootstrap.boot import MyClass這也失敗,修復此SystemError: Parent module '' not loaded, cannot perform relative import

一個黑客是當我的virtualenv activate腳本

+0

您是否嘗試過? – danielfranca

+0

是的,我編輯了這個問題,謝謝。 – ivica

+1

嘗試添加一個'__init __。py'到'MY_PROJECT /目錄,看看是否有幫助 – dhdavvie

回答

4

您收到此錯誤,因爲模塊搜索路徑只包括當前目錄的底部添加export PYTHONPATH="/root/my_project",而不是其父母;由於您的其他模塊不在PYTHONPATH中,因此無法導入。

您可以通過在腳本中印sys.path發現這一點你自己。

我創建了一個目錄t有以下幾點:

$ tree 
. 
├── a.py 
├── bar 
│   ├── __init__.py 
│   └── world.py 
└── foo 
    ├── hello.py 
    └── __init__.py 

2 directories, 5 files 

這裏是hello.py來源:

$ cat foo/hello.py 
import sys 
print("I am in {}".format(__file__)) 
for path in sys.path: 
    print(path) 

from bar.world import var 
print(var) 

現在看會發生什麼,當我執行foo/hello.py並嘗試從bar/world.py進口的東西;

$ python foo/hello.py 
I am in foo/hello.py 
/home/burhan/t/foo 
/usr/lib/python2.7 
/usr/lib/python2.7/plat-x86_64-linux-gnu 
/usr/lib/python2.7/lib-tk 
/usr/lib/python2.7/lib-old 
/usr/lib/python2.7/lib-dynload 
/home/burhan/.local/lib/python2.7/site-packages 
/usr/local/lib/python2.7/dist-packages 
/usr/lib/python2.7/dist-packages 
Traceback (most recent call last): 
    File "foo/hello.py", line 6, in <module> 
    from bar.world import var 
ImportError: No module named bar.world 

您可以從打印的路徑中知道只有系統級Python庫路徑和腳本的當前目錄被列出。這就是爲什麼它找不到bar.world

要解決這個問題,你可以調整PYTHONPATH或使用相對進口;例如:

$ PYTHONPATH=../t python foo/hello.py 
I am in foo/hello.py 
/home/burhan/t/foo 
/home/burhan/t 
/usr/lib/python2.7 
/usr/lib/python2.7/plat-x86_64-linux-gnu 
/usr/lib/python2.7/lib-tk 
/usr/lib/python2.7/lib-old 
/usr/lib/python2.7/lib-dynload 
/home/burhan/.local/lib/python2.7/site-packages 
/usr/local/lib/python2.7/dist-packages 
/usr/lib/python2.7/dist-packages 
42 

你在這裏看到我手動更改PYTHONTPATH和添加腳本的公共父(42從酒吧/世界推出)。

爲了解決這個問題,使用相對進口,你首先有一個建立在最上面的目錄包,否則你會得到著名Attempted relative import in non-package錯誤;更多關於這和細節上的Python 3進口的作品,怎麼也得看看:「從my_project.bootstrap進口MyClass的」 Relative imports in Python 3

+1

您是否介意經歷如何創建頂層的包? – dhdavvie