我通过CherryPy提供django页面。当CherryPy在前台启动时,一切正常。当我用
守护CherryPy时Daemonizer(cherrypy.engine).subscribe()
我得到了一个ImportError。
sys.path
在两种情况下都是完全相同的(守护程序和非守护程序)。我怎样才能调试这个,除sys.path
之外还有什么影响python导入?
回溯:
[02/Sep/2014:03:08:46] ENGINE ImproperlyConfigured('Error importing module plinth.modules.first_boot.middleware: "No module named middleware"',)
Traceback (most recent call last):
File "/usr/lib/python2.7/dist-packages/cherrypy/wsgiserver/wsgiserver2.py", line 1353, in communicate
req.respond()
File "/usr/lib/python2.7/dist-packages/cherrypy/wsgiserver/wsgiserver2.py", line 868, in respond
self.server.gateway(self).respond()
File "/usr/lib/python2.7/dist-packages/cherrypy/wsgiserver/wsgiserver2.py", line 2267, in respond
response = self.req.server.wsgi_app(self.env, self.start_response)
File "/usr/lib/python2.7/dist-packages/cherrypy/_cptree.py", line 299, in call
return app(environ, start_response)
File "/usr/lib/python2.7/dist-packages/django/core/handlers/wsgi.py", line 187, in call
self.load_middleware()
File "/usr/lib/python2.7/dist-packages/django/core/handlers/base.py", line 45, in load_middleware
mw_class = import_by_path(middleware_path)
File "/usr/lib/python2.7/dist-packages/django/utils/module_loading.py", line 26, in import_by_path
sys.exc_info()[2])
File "/usr/lib/python2.7/dist-packages/django/utils/module_loading.py", line 21, in import_by_path
module = import_module(module_path)
File "/usr/lib/python2.7/dist-packages/django/utils/importlib.py", line 40, in import_module
import(name)
ImproperlyConfigured: Error importing module plinth.modules.first_boot.middleware: "No module named middleware"
/home/fbx/code/plinth/plinth/modules/first_boot/middleware.py
'/home/fbx/code/plinth'
import_module
函数中。 name
的参数import_module
为"plinth.modules.first_boot.middleware"
'plinth.modules.first_boot.middleware.FirstBootMiddleware'
还有一点说明:
我在目录python -m plinth
中使用/home/fbx/code/plinth
运行守护程序服务器
当我用/usr/bin/python /home/fbx/code/plinth/plinth/__main__.py
启动守护进程的服务器时,一切正常!在这种情况下,sys.path
还有一个条目:/home/fbx/code/plinth/plinth
。但是,在启动时手动添加此路径并不会在以python -m plinth
运行时修复ImportError。
我正在运行此代码:https://github.com/freedombox/Plinth/tree/0b5af376102f4210395c15b2366b96a6e56fefb2
更新
谢谢@cyraxjoe,os.chdir()
与__init__.py
中缺少的模块相结合是问题所在。对我来说这种行为是出乎意料的,我没有找到很多有用的信息/文档,所以我设置了一个github仓库来更容易地证明这个问题:https://github.com/fonfon/ImportError-demo
答案 0 :(得分:2)
这只是一个理论,但可能就是原因。
鉴于:
os.chdir('/')
。plinth.modules.first_boot
明确导入first_boot
,而不是包的__init__.py
上的中间件。可能是在Daemonizer插件更改目录之前,导入模块plinth.modules.first_boot
但没有中间件,所以当django尝试动态导入模块时,它只是在导入缓存上找到模块但是它找不到中间件,因为路径是相对的,当Daemonizer插件更改目录时,它就变得无法访问。
尝试在软件包的__init__
上导入中间件模块。
基本上在__init__
from . import middleware