我整天都被困在一个似乎非常愚蠢的进口问题上。从我的 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
或 by运行我的应用程序时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')
目录布局正是您所期望的:
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
- ... ETC ...
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
在导入过程中,Pythonproject/
之前正在查找snpp/
并找到一个旧snpp.pyc
文件。它将导入旧的 pyc 文件并感到满意,从而忽略整个snpp/
目录。
如果我更敏锐一点(或者对 Python 更有经验),我可能会注意到,每当我尝试从snpp/
. 我应该想到整个模块都很不稳定,而不仅仅是我目前尝试使用的一个功能。