settings.py文件中的Django AttributeError

时间:2013-05-28 23:18:40

标签: python django python-2.7 virtualenv python-module

我整天都被困在一个看似非常愚蠢的进口问题上。从我的Django项目目录中,我可以导入一个模块并运行一个函数fime:

(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')

目录布局正如您所期望的那样:

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目录中:

  • /家庭/ 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 个答案:

答案 0 :(得分:2)

使用

检查输入的确切内容
snpp.__file__

import snpp陈述之后。

实际上,导入可能不是您希望看到的路径。