1

私は一日中、非常にばかげたインポートの問題と思われる問題に悩まされていました。私の 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.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'

私のファイルの関連する 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は問題になりません。snppwww

  • /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 つの機能だけでなく、モジュール全体が不安定であることに気がついたはずです。

4

1 に答える 1

2

を使用して、インポートされているものを正確に確認します

snpp.__file__

import snpp発言直後。

実際には、インポートはあなたが期待しているパスからのものではないかもしれません。

于 2013-05-29T01:13:22.213 に答える