Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 无法导入模块_Python_Apache_Wsgi - Fatal编程技术网

Python 无法导入模块

Python 无法导入模块,python,apache,wsgi,Python,Apache,Wsgi,我创建了一个具有以下目录结构的python web应用程序: # cd /usr/local/www/myapp modules layout __init__.py layout.py packages public myapp.wsgi 我已将PYTHONPATH设置为: /usr/local/www/myapp/modules:/usr/local/www/myapp/packages 在myapp.wsgi中,我尝试执行以下操作: impor

我创建了一个具有以下目录结构的python web应用程序:

# cd /usr/local/www/myapp

modules
    layout
        __init__.py
        layout.py
packages
public
myapp.wsgi
我已将PYTHONPATH设置为:

/usr/local/www/myapp/modules:/usr/local/www/myapp/packages
在myapp.wsgi中,我尝试执行以下操作:

import layout
但我得到了内部服务器错误。为什么?

这是我的myapp.wsgi(如果我删除导入布局行,它会工作):

我收到的完整错误消息:

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator, webmaster@example.com and inform them of the time the error occurred, and anything you might have done that may have caused the error.

More information about this error may be available in the server error log.
我的虚拟主机配置:

<VirtualHost *:80>

    ServerName localhost
    ServerAlias localhost
    ServerAdmin webmaster@example.com

    DocumentRoot /usr/local/www/myapp/public

    <Directory /usr/local/www/myapp/public>
    Order allow,deny
    Allow from all
    </Directory>

    WSGIScriptAlias / /usr/local/www/myapp/myapp.wsgi

    <Directory /usr/local/www/myapp>
    Order allow,deny
    Allow from all
    </Directory>

</VirtualHost>

服务器名本地主机
服务器别名本地主机
服务器管理员webmaster@example.com
DocumentRoot/usr/local/www/myapp/public
命令允许,拒绝
通融
WSGIScriptAlias//usr/local/www/myapp/myapp.wsgi
命令允许,拒绝
通融
来自/var/log/httpd-Error.log的错误:

[Fri Jan 20 15:31:03 2012] [error] [client 192.168.201.123] mod_wsgi (pid=1725): Target WSGI script '/usr/local/www/myapp/myapp.wsgi' cannot be loaded as Python module.
[Fri Jan 20 15:31:03 2012] [error] [client 192.168.201.123] mod_wsgi (pid=1725): Exception occurred processing WSGI script '/usr/local/www/myapp/myapp.wsgi'.
[Fri Jan 20 15:31:03 2012] [error] [client 192.168.201.123] Traceback (most recent call last):
[Fri Jan 20 15:31:03 2012] [error] [client 192.168.201.123]   File "/usr/local/www/myapp/myapp.wsgi", line 3, in <module>
[Fri Jan 20 15:31:03 2012] [error] [client 192.168.201.123]     import layout
[Fri Jan 20 15:31:03 2012] [error] [client 192.168.201.123] ImportError: No module named layout
[Fri Jan 20 15:31:03 2012][error][client 192.168.201.123]mod_wsgi(pid=1725):无法将目标wsgi脚本'/usr/local/www/myapp/myapp.wsgi'作为Python模块加载。
[Fri Jan 20 15:31:03 2012][error][client 192.168.201.123]mod_wsgi(pid=1725):处理wsgi脚本'/usr/local/www/myapp/myapp.wsgi'时发生异常。
[Fri Jan 20 15:31:03 2012][error][client 192.168.201.123]回溯(最近一次通话最后一次):
[Fri Jan 20 15:31:03 2012][error][client 192.168.201.123]文件“/usr/local/www/myapp/myapp.wsgi”,第3行,在
[Fri Jan 20 15:31:03 2012][error][client 192.168.201.123]导入布局
[Fri Jan 20 15:31:03 2012][error][client 192.168.201.123]导入错误:没有名为layout的模块
打印系统路径的输出:


您的
布局
文件夹中有
\uuuuu init.\uuuu py
,但它应该是
\uuuuu init.py
。这段时间放错地方了。我不确定这是否是您文章中的输入错误,但如果您的文件看起来是这样的话,则会导致此问题。

请先尝试:

python /usr/local/www/myapp/myapp.wsgi
它装载正确吗

如果是,那么可能您的应用程序需要一些环境(在
~/.bashrc
或类似的环境中)。试试看:

# to wipe-out extra env
env -i bash
# try again
python /usr/local/www/myapp/myapp.wsgi
验证您在shell中使用的python与ApacheWSGi使用的python相同

如果您的
myapp.wsgi
需要任何额外的环境才能正确加载,则可以执行以下操作之一:

  • 在apache中设置,或
  • 在myapp.wsgi的运行时中设置
要在WSGI代码中设置,下面是示例代码

import os, sys
EXTRA_DIR = os.path.realpath(os.path.join(os.path.dirname(__file__), '..', '..'))
if EXTRA_DIR not in sys.path:
    sys.path.append(EXTRA_DIR)

放入myapp.wsgi文件的开头。

模块目录还需要一个
\uuuu init\uuuuu.py
文件来定义为包。

我遇到了一个类似的问题,这就解决了它:

chmod a+x myapp.wsgi

如果在apache error.log文件中获得“ImportError:No module named web”,则可以在导入web之前尝试在code.py中设置绝对路径:


这对我来说非常有效。

至少包括您收到的完整准确的错误消息。您是如何运行web服务器的?它很可能不使用您的环境,因此,为您自己的shell设置PYTHONPATH不会有任何帮助。我正在使用Apache mod_wsgi,并且我已经为/usr/local/www/myapp创建了一个虚拟主机。@在浏览器和虚拟主机配置中添加了一条错误消息。您发布的错误消息不是我们要查找的错误消息,请查看服务器错误日志。寻找python的“回溯”。另外,我想知道您是否只是错误地指定了导入。如果
layout.py
包含感兴趣的代码,则需要执行
import layout.layout
或从layout import layout导入
。我尝试了所有这些。什么都没用。env-i bash无法工作,因为我正在使用FreeBSD。如果您无法执行
env-i
操作,请手动检查您的环境
env
命令和配置文件脚本。您是否使用virtualenv或类似软件?python/usr/local/www/myapp/myapp.wsgi的输出是什么?请看我的问题。我包括了httpd-error.log的摘录。在编写python/usr/local/www/myapp/myapp.wsgi时,shell中也出现了相同的错误。当我在文件sys.path.append('/usr/local/www/myapp/modules')的顶部添加这一行时,它会起作用。@RichardKnop:正如在我的帖子中一样,您需要在apache配置中使用WSGIPythonPath,或者在wsgi代码中使用sys.path.append()。
模块
不是一个包(基于所示的
PYTHONPATH
)。
chmod a+x myapp.wsgi
import sys, os
abspath = os.path.dirname(__file__)
sys.path.append(abspath)
os.chdir(abspath)
import web