私は一日中、非常にばかげたインポートの問題と思われる問題に悩まされていました。私の Django プロジェクト ディレクトリから、モジュールをインポートして、すぐに関数を実行できます。
(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'
私のファイルの関連する 2 行は、settings.py
まさにあなたが期待するものです。モジュールを正常にインポートできますが、config_url()
関数が見つからないことに注意してください。
import snpp
SNPP = snpp.config_url('snpp://server.name.com:1234?user=me&pass=whatever')
ディレクトリのレイアウトはまさにあなたが期待するものです:
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
私はあらゆる種類のことを試しました:
from snpp import config_url
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
- /home/slashingweapon/msg-gw/www
- /home/slashingweapon/msg-gw/lib/python2.7/site-packages/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
リストにあるかどうかは関係ありません。同じ結果が得られます。
解決済み
SOの住人の助けを借りて、私は問題を発見しました。
project
再利用可能なコードの一部をディレクトリから新しいディレクトリに移動して、アプリケーションをリファクタリングしましたsnpp
。*.pyc
私がそれをしたとき、私はファイルを移動または削除することを怠っていました.
の値snpp.__file__
は次のとおりです。
/home/slashingweapon/msg-gw/www/project/snpp.pyc
期待される代わりに:
/home/slashingweapon/msg-gw/www/snpp/__init__.pyc
インポート プロセス中に、Python はproject/
以前に調べてsnpp/
、古いsnpp.pyc
ファイルを見つけていました。古いpycファイルをインポートして満足するため、ディレクトリ全体を無視しますsnpp/
。
私がもう少し賢かったら (または Python の経験がもう少しあれば) snpp/
、. 私が今使おうとしていた 1 つの機能だけでなく、モジュール全体が不安定であることに気がついたはずです。