WSGI: ImportError: No module named hello (module in the same directory of the main .py file)

WSGI: ImportError: No module named hello (module in the same directory of the main .py file)

这不是 的副本,因为这里我 不是 使用任何 virtualenv,而且我 不是 试图导入另一个框架的模块(例如 django),但只是一个模块 在同一目录 .


这是我的设置:

/var/www/test/app.py:

import os, time, sys
from bottle import route, run, template, default_app

os.chdir(os.path.dirname(os.path.abspath(__file__)))

import hello

@route('/')
def index():
    return 'Hello world Python ' + sys.version

application = default_app()

/var/www/test/hello.py:

# just an example module
def test():
    print 'hello'

Apache 配置:

<VirtualHost *:80>
  ServerName example.com
  <Directory />
    Require all granted
  </Directory>
  WSGIScriptAlias / /var/www/test/app.py
  WSGIDaemonProcess test user=www-data group=www-data processes=5 threads=5 display-name=test python-path=/var/www/test/
</VirtualHost>

然后我得到:

ImportError: No module named hello

哪里不对? WSGIDaemonProcess ... python-path=/var/www/test/ 不应该帮助加载模块 hello 吗?

解决方法是:

  • 确实有一个WSGIDaemonProcess ... python-path=...

  • 还有一个 WSGIScriptAlias ... process-group=...(不知道为什么这个 process-group 参数与允许或不允许从相同的目录,但它有效!)

示例:

WSGIScriptAlias / /var/www/test/app.py process-group=test
WSGIDaemonProcess test user=www-data group=www-data processes=5 threads=5 display-name=test python-path=/var/www/test/

另请参阅:https://bottlepy.org/docs/dev/deployment.html#apache-mod-wsgi

Apache 不会切换到当前工作目录,因此它不会在您认为的地方搜索 hello。

您可以按以下方式更改 app.py。

import os, time, sys
from bottle import route, run, template, default_ap
# add the scripts directory to the python path so that hello can be found
sys.path.insert(0, os.path.realpath(os.path.dirname(__file__)))

优点是您不必弄乱 apache 配置文件