我一直被困在似乎是一個非常愚蠢的進口問題。從我的Django項目目錄,我可以導入模塊和運行功能只是FIME:settings.py文件中的Django AttributeError
(msg-gw)slashingweapon:~/msg-gw/www$ python
>>> import snpp
>>> snpp.config_url('snpp://server.name.com:1234?user=me&pass=whatever')
{'host': 'server.name.com', 'pass': 'whatever', 'port': 1234, 'user': 'me'}
但是當我嘗試運行我的應用程序,無論是通過manage.py
或gunicorn
,我得到一個屬性錯誤:
(msg-gw)slashingweapon:~/msg-gw/www$ python manage.py runserver 8000
File "/home/slashingweapon/msg-gw/www/project/settings.py", line 26, in <module>
SNPP = snpp.config_url('snpp://server.name.com:1234?user=me&pass=whatever')
AttributeError: 'module' object has no attribute 'config_url'
我的settings.py
文件中的兩個相關行正是您所期望的。請注意,我可以導入模塊,但沒有找到config_url()
函數。
import snpp
SNPP = snpp.config_url('snpp://server.name.com:1234?user=me&pass=whatever')
的目錄佈局正是你所期待的:
from snpp import config_url
:www | +-project | +-__init__.py | +-settings.py | +-urls.py | +-views.py | +-wsgi.py | +-snpp +-__init__.py +-protocol.py +-views.py +-urls.py
的
config_url()
功能裏面snpp/__init__.py
我已經嘗試了各種東西定義
- 移動
config_url
到文件snpp/config
,然後導入與import snpp.confg
from snpp.config import config_url
from snpp import config
,然後調用通過config.config_url()
的__init__.py
文件是沒有什麼特別的。它只是讓你編碼一些服務器信息作爲一個字符串,所以你可以堅持你的SNPP配置到環境中:
import urlparse
def config_url(urlStr):
config = {
'host':None,
'port':444,
'user':None,
'pass':None,
}
url = urlparse.urlparse(urlStr)
if url.scheme == 'snpp':
locParts = url.netloc.split(":")
config['host'] = locParts[0]
if len(locParts) > 1:
port = int(locParts[1])
if port > 0:
config['port'] = port
args = urlparse.parse_qs(url.query)
config['user'] = args.get('user', [None])[0]
config['pass'] = args.get('pass', [None])[0]
return config
我使用Python 2.7,Django的1.5.1和的virtualenv。
我的項目的其他部分工作得很好。當我在瀏覽器中打印出路徑時,它看起來是正確的。導入snpp
不應該是一個問題,因爲snpp
是在www
目錄:
- /家庭/ slashingweapon/MSG-GW/WWW
- /home/slashingweapon/msg-gw/lib/python2.7/站點包/ setuptools的-0.6c11-py2.7.egg
- /home/slashingweapon/msg-gw/lib/python2.7/site-packages/pip-1.3.1-py2.7.egg
- /home/slashingweapon/msg-gw/lib/python2.7/site-packages/django_json_rpc-0.6.2-py2.7.egg
- /home/slashingweapon/msg-gw/lib/python27.zip
- /home/slashingweapon/msg-gw/lib/python2.7
- ...等...
不管snpp模塊是否在我的INSTALLED_APPS
列表中或沒有。我得到相同的結果。
解決
有了這麼居民們的幫助下,我發現這個問題。
我通過將project
目錄中的一些可重用代碼段移動到新的snpp
目錄來重構我的應用程序。當我這樣做時,我忽略移動或刪除*.pyc
文件。
的snpp.__file__
的價值是:
/home/slashingweapon/msg-gw/www/project/snpp.pyc
,而不是預期:
/home/slashingweapon/msg-gw/www/snpp/__init__.pyc
在導入過程中,巨蟒正在尋找在project/
snpp/
之前,尋找一個老snpp.pyc
文件。它會導入舊的pyc文件並得到滿足,從而忽略整個snpp/
目錄。
如果我試圖從snpp/
導入任何東西,我可能會注意到一般情況下會出現一些奇怪的導入行爲。我應該想到,整個模塊都是不可靠的,而不僅僅是我目前試圖使用的一個功能。
你可能需要在你的'sys.path'中附加'../ snpp'。嘗試打印'sys.path'並查看是否列出了項目的根目錄。 – jozzas
它發現snpp目錄很好。我知道,因爲如果我將import語句更改爲'import snppx',那麼在該行代碼上會出現ImportError異常。我已經編輯了一些帖子來澄清我的路徑。 – slashingweapon
呵呵。我在這裏抓住了吸管,但是您是否嘗試過註釋settings.py位,運行manage.py shell並檢查該Python環境中snp路徑和config_url名稱的存在?如果它在導入中以某種方式獲得除你的模塊以外的東西,那可以解釋這一點。 –