2016-05-10 55 views
0

說我的項目的結構是這樣的:相對進口3

myproject 
├── calendar.py 
├── foo.py 
└── __init__.py 

在foo.py,我有

from calendar import isleap 

我在Python 3.x的思想,而不使用明確.calendar上面的代碼應該加載內置日曆模塊,而不是我自己的日曆模塊,但顯然我的本地calendar.py仍然在導入,並且由於mypkg/calendar.py中沒有'isleap'而引發錯誤。爲什麼我的本地日曆模塊在這裏導入?

我不得不重新命名calendar.py到cal.py得到這個工作..

+0

什麼是你的問題? – zondo

+0

問題是,爲什麼我的本地日曆模塊正在加載? – Godsent

+0

因爲這是模塊正在搜索的第一個位置。 – DeepSpace

回答

2

from __future__ import absolute_import是Python 3的默認因此from calendar import isleap語句導入頂層模塊calendar

如果您看到其他結果;這意味着要麼你沒有使用Python 3,要麼嘗試從一個包中運行一個Python模塊作爲腳本(myproject目錄本身在sys.path中)。如果後者則您的calendar.py成爲頂級模塊,並且(由於當前目錄在sys.path之前出現stdlib目錄)from calendar import isleap從當前目錄導入calendar.py"Never add a package directory, or any directory inside a package, directly to the Python path"

要避免它,不要直接在python包中運行模塊,例如,不要這樣做:cd myproject; python foo.py。做這個,而不是:python -mmyproject.foo(或者你可以define what scripts should be run in setup.pycreate a similar script manually: from myproject import foo; foo.main())。

如果你想運行一個Python包作爲腳本,然後創建myproject/__main__.py然後運行python -mmyproject


如果你想在Python 3中做相對導入;做到這一點明確例如,在myproject/foo.py

from .calendar import something 

或者做一個絕對的導入:

from myproject.calendar import something 
2

它看起來像你的路徑或目錄結構設置錯了。

鑑於以下結構,日曆模塊的全名應爲myproject.calendar。您可以通過打印出模塊的__name__屬性來進行檢查。對於這種情況,程序用於導入本地模塊的路徑必須是包含myproject的文件夾。

myproject 
├── calendar.py 
├── foo.py 
└── __init__.py 

看起來你用的路徑實際上是myproject。含義calendar.py轉變爲根級模塊calendar,而不是myproject.calendar。 Python更喜歡本地模塊內置的模塊,因此導入您的calendar模塊。

更典型的你可能會這樣做。

MyProjectFolder 
├── main.py 
└── myproject 
    ├── calendar.py 
    ├── foo.py 
    └── __init__.py 

,然後運行您的程序是這樣的:

#! /bin/bash 
cd /path/to/MyProjectFolder 
python main.py 
-1

Python會檢查你的本地模塊和import首先加載它們。

from calendar import isleap將首先在您的語言環境包中搜索模塊calendar。如果沒有找到,它將從內建庫calendar導入。

from .calendar import isleap只會從您的區域設置模塊calendar導入。如果沒有找到,則引發異常ImportError

這就是爲什麼你應該在包中使用相對導入。

你可以這樣做,導入內置庫而不檢查本地模塊。但這只是一個竅門。我永遠不會在生產中使用它。你應該更好地重命名你的模塊calendar

import imp, sys 
f, pathname, desc = imp.find_module("calendar", sys.path[1:]) 
calendar = imp.load_module("calendar", f, pathname, desc) 
f.close() 

from calendar import isleap