2013-05-28 62 views
1

我一直被困在似乎是一個非常愚蠢的進口問題。從我的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.pygunicorn,我得到一個屬性錯誤:

(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/導入任何東西,我可能會注意到一般情況下會出現一些奇怪的導入行爲。我應該想到,整個模塊都是不可靠的,而不僅僅是我目前試圖使用的一個功能。

+0

你可能需要在你的'sys.path'中附加'../ snpp'。嘗試打印'sys.path'並查看是否列出了項目的根目錄。 – jozzas

+0

它發現snpp目錄很好。我知道,因爲如果我將import語句更改爲'import snppx',那麼在該行代碼上會出現ImportError異常。我已經編輯了一些帖子來澄清我的路徑。 – slashingweapon

+2

呵呵。我在這裏抓住了吸管,但是您是否嘗試過註釋settings.py位,運行manage.py shell並檢查該Python環境中snp路徑和config_url名稱的存在?如果它在導入中以某種方式獲得除你的模塊以外的東西,那可以解釋這一點。 –

回答

2

檢查究竟正通過

snpp.__file__ 

之後import snpp聲明進口。

實際上,導入可能不是您期望看到的路徑。