我通过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
相关的sys.path条目(发生ImportError时也会出现):'/home/fbx/code/plinth'
ImportError发生在https://github.com/django/django/blob/master/django/utils/importlib.py的djangos import_module函数中。
name的参数import_module"plinth.modules.first_boot.middleware"
django MIDDLEWARE_CLASSES设置为'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

最佳答案

这只是一个理论,但这可能是原因。

鉴于:


Deamonizer插件changes the directory to the root os.chdir('/')
plinth.modules.first_boot明确导入first_boot,而不是包__init__.py上的中间件。


可能是在Daemonizer插件更改目录之前,模块plinth.modules.first_boot已导入但没有中间件,因此,当d尝试动态导入模块时,它只是在导入缓存中找到了模块,但找不到该模块。中间件,因为该路径是相对的,并且当Daemonizer插件更改目录时,它将变得不可访问。

尝试在包的__init__上导入中间件模块。

基本上在from . import middleware上添加__init__

10-07 18:19