它是__init__.py
而不是init.py
。確保層次結構中的每個目錄都包含它以便能夠導入。
編輯:我設法重現它。 這裏的目錄結構:
[email protected]:/tmp/asdasd$ tree
.
`-- myapp
|-- __init__.py
|-- models
| |-- __init__.py
| `-- models.py
|-- scripts
| |-- data.py
| `-- __init__.py
`-- tests
|-- __init__.py
`-- tests.py
我把下面的代碼在data.py
的一開始就縮小問題:
import sys
import pprint
pprint.pprint(sys.path)
from myapp.models.models import *
運行data.py
的OP方式表示yeilds導入錯誤:
[email protected]:/tmp/asdasd$ python myapp/scripts/data.py
['/tmp/asdasd/myapp/scripts',
'/usr/lib/python2.6',
'/usr/lib/python2.6/plat-linux2',
'/usr/lib/python2.6/lib-tk',
-- Skipped --
'/usr/local/lib/python2.6/dist-packages']
Traceback (most recent call last):
File "myapp/scripts/data.py", line 6, in
from myapp.models.models import *
ImportError: No module named myapp.models.models
但是,這種方式就像一個魅力:
[email protected]:/tmp/asdasd$ python -m myapp.scripts.data
['',
'/usr/lib/python2.6',
'/usr/lib/python2.6/plat-linux2',
'/usr/lib/python2.6/lib-tk',
-- Skipped --
'/usr/local/lib/python2.6/dist-packages']
請注意第一項sys.path
的區別。
'來自foo import *'非常令人沮喪,因爲它會導致命名空間衝突。很難說出目前這種說法可能會發生什麼。 – msw 2010-08-21 14:03:14
我也試着避免用'import'等Python關鍵字來命名模塊。現在你不能'輸入myapp.import'! – bobince 2010-08-21 14:06:52
我將它重命名爲python myapp/scripts/data.py,但仍然是同樣的問題 – 2010-08-21 14:26:41