Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.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
mod_wsgi未找到模块-apache、RHEL、python3.4_Python_Mod Wsgi_Python 3.4_Rhel - Fatal编程技术网

mod_wsgi未找到模块-apache、RHEL、python3.4

mod_wsgi未找到模块-apache、RHEL、python3.4,python,mod-wsgi,python-3.4,rhel,Python,Mod Wsgi,Python 3.4,Rhel,我让mod_wsgi在RHEL/Apache2.4/python3.4/djang1.11/virtualenv上运行良好。然后,我在virtualenv中使用pip将numpy从1.14.0升级到1.14.2,安装pandas,并安装其他几个模块。然后我重新启动了Apache,并开始出现服务器错误,表明在尝试调用numpy.arange时,AttributeError:'module'对象没有属性'arange',或者在尝试调用matplotlib.use('Agg')时出现类似错误,等等 我

我让mod_wsgi在RHEL/Apache2.4/python3.4/djang1.11/virtualenv上运行良好。然后,我在virtualenv中使用pip将numpy从1.14.0升级到1.14.2,安装pandas,并安装其他几个模块。然后我重新启动了Apache,并开始出现服务器错误,表明在尝试调用numpy.arange时,
AttributeError:'module'对象没有属性'arange',或者在尝试调用matplotlib.use('Agg')时出现类似错误,等等

我用以下内容替换了wsgi.py,它工作得很好。一旦我取消对任何numpy或matplotlib调用的注释,它将返回一个500错误,并且在apache错误日志中显示一个类似于
AttributeError的错误:“module”对象没有属性…

import datetime
import sys
import numpy as np
import matplotlib as mpl
import mod_wsgi

def application(env, start_response):

    #mpl.use('Agg')
    #a = np.arange(15).reshape(3, 5)
    #a = np.array([2,3,4])

    status = '200 OK'
    output = 'Hello World! This is the wsgi app generated from python!'
    output += '\n\ncurrent time is: '+str(datetime.datetime.now())
    output += '\n\nsys.executable='+sys.executable
    output += '\n\nsys.path='+str(sys.path)
    output += '\n\nsys.version=' + str(sys.version)
    output += '\n\nsys.prefix=' +  str(sys.prefix)
    output += '\n\nmod_wsgi.version='+str(mod_wsgi.version)
    output += '\n\n\nEnvironment Variables:\n\n'+'\n'.join('%s: %s' % (k, v) for (k, v) in env.items())
    output = bytes(output,'utf-8')
    response_headers = [('Content-type', 'text/plain'),
                            ('Content-Length', str(len(output)))]
    start_response(status, response_headers)
    return [output]
此wsgi.py的相关输出:

sys.executable=/usr/bin/python3
sys.path=['/usr/local/virtualenvs/myapp/wsgiapp', '/usr/local/virtualenvs/myapp/lib64/python34.zip', '/usr/local/virtualenvs/myapp/lib64/python3.4', '/usr/local/virtualenvs/myapp/lib64/python3.4/plat-linux', '/usr/local/virtualenvs/myapp/lib64/python3.4/lib-dynload', '/usr/lib64/python3.4', '/usr/lib/python3.4', '/usr/local/virtualenvs/myapp/lib/python3.4/site-packages']
sys.version=3.4.8 (default, Mar 23 2018, 10:04:27) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-16)]
sys.prefix=/usr/local/virtualenvs/myapp
mod_wsgi.version=(4, 5, 24)
mod_wsgi.process_group: mywsgiapp
mod_wsgi.application_group: 
apachehttpd.conf没有改变。相关线路:

LoadModule wsgi_module "/usr/local/virtualenvs/myapp/lib64/python3.4/site-packages/mod_wsgi/server/mod_wsgi-py34.cpython-34m.so"
WSGIDaemonProcess mywsgiapp python-home=/usr/local/virtualenvs/myapp python-path=/usr/local/virtualenvs/myapp/wsgiapp
WSGIProcessGroup mywsgiapp
WSGIApplicationGroup %{GLOBAL}
WSGIScriptAlias /myapp /usr/local/virtualenvs/myapp/wsgiapp/wsgi.py process-group=mywsgiapp application-group=%{GLOBAL}
我不确定是什么原因导致了这个破裂。我知道当mod_wsgi为错误的python版本编译时,通常会发生这种情况。但是这在以前工作得很好,而且似乎所有的配置都是正确的:mod_wsgi正在运行,wsgi.py的输出表明它使用的是正确版本的python,并且virtualenv的site packages目录位于python路径中

我已经在python3.4的主位置安装了mod_wsgi,并尝试将apacheloadmodule指向该实例,但仍然得到相同的错误

我还应该检查什么

sys.executable是否应该指向virtualenv而不是主python安装?我应该
pip卸载所有模块并重新开始吗

另外,要安装pandas,我必须安装Cython,这反过来要求我安装gcc-c++(
sudo-yum-install-gcc-c++
)。这会影响什么吗

编辑以添加错误跟踪。我在上面的wsgi.py文件中取消了对行
a=np.arange(15)的注释

来自Apache的HTTP错误页:

内部服务器错误 服务器遇到内部错误或错误 配置错误,无法完成 你的要求

请通过以下地址与服务器管理员联系: root@localhost要通知他们此错误发生的时间, 以及您在此错误之前执行的操作

有关此错误的详细信息,请参阅 在服务器错误日志中

Apache错误日志(注意,在这里发布之前,我将IP地址打了x):

尝试显示np时出错。文件

[Thu Jul 12 23:25:59.196534 2018] [wsgi:error] [pid 22747] [remote 10.x.x.x:60353] mod_wsgi (pid=22747): Exception occurred processing WSGI script '/usr/local/virtualenvs/myapp/wsgiapp/wsgi.py'.
[Thu Jul 12 23:25:59.257214 2018] [wsgi:error] [pid 22747] [remote 10.x.x.x:60353] Traceback (most recent call last):
[Thu Jul 12 23:25:59.257500 2018] [wsgi:error] [pid 22747] [remote 10.x.x:60353]   File "/usr/local/virtualenvs/myapp/wsgiapp/wsgi.py", line 23, in application
[Thu Jul 12 23:25:59.257535 2018] [wsgi:error] [pid 22747] [remote 10.x.x.x:60353]     output += '\\n\\nnumpy file location='+str(np.__file__)
[Thu Jul 12 23:25:59.257569 2018] [wsgi:error] [pid 22747] [remote 10.x.x.x:60353] AttributeError: 'module' object has no attribute '__file__'
另外,仅供参考,如果我激活virtualenv并使用解释器,导入模块的效果很好:

Python 3.4.8 (default, Mar 23 2018, 10:04:27)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> np.__file__
'/usr/local/virtualenvs/myapp/lib/python3.4/site-packages/numpy/__init__.py'
从wsgi.py文件打印dir(np)会导致:

dir(np)=['__doc__', '__loader__', '__name__', '__package__', '__path__', '__spec__']
['ALLOW_THREADS', 'AxisError', 'BUFSIZE', 'CLIP', 'ComplexWarning', 'DataSource', 'ERR_CALL', ..... clipped for brevity - there's a full screen of items in the list
所以它不会出错,但它不是标识符的完整列表。从virtualenv解释器运行dir(np)会导致:

dir(np)=['__doc__', '__loader__', '__name__', '__package__', '__path__', '__spec__']
['ALLOW_THREADS', 'AxisError', 'BUFSIZE', 'CLIP', 'ComplexWarning', 'DataSource', 'ERR_CALL', ..... clipped for brevity - there's a full screen of items in the list
由于它确实列出了一些标识符,下面是从wsgi.py中打印每个标识符的结果。它似乎确实从正确的路径拾取了包

np.__path__ =_NamespacePath(['/usr/local/virtualenvs/myapp/lib/python3.4/site-packages/numpy'])
np.doc=None
np.loader=<_frozen_importlib._NamespaceLoader object at 0x7f83b82e0c88>
np.package=numpy
np.name=numpy
np.Spec=ModuleSpec(name='numpy', loader=None, origin='namespace', submodule_search_locations=_NamespacePath(['/usr/local/virtualenvs/myapp/lib/python3.4/site-packages/numpy']))
np.\uuuu path\uuuuuu=\u名称空间路径(['/usr/local/virtualenvs/myapp/lib/python3.4/site packages/numpy']))
np.doc=无
np.loader=
np.package=numpy
np.name=numpy
np.Spec=ModuleSpec(name='numpy',loader=None,origin='namespace',submodule\u search\u locations=\u NamespacePath(['/usr/local/virtualenvs/myapp/lib/python3.4/site packages/numpy']))

为了确保wsgi/python真正找到了numpy包,我将wsgi.py文件更改为导入一个不存在的包
import foo as np
,当我再次运行它时,它出错为
ImportError:No module name'foo'
。所以它看起来确实在寻找网站包。。。但只是没有完全加载它们?

有趣的事实:当pip安装新模块时,它会设置权限,以便用户能够按预期导入和使用模块,但“其他”权限允许查看模块,但不允许执行模块。因此,在Apache下运行的mod_wsgi能够导入模块,但调用任何方法都会导致错误


解决方案:安装或更新python模块后,请仔细检查权限!我将所有目录设置为755,所有文件设置为644,这似乎有效。或者,如注释中所述,确保在运行pip之前正确设置了umask。

包括Python exception.HTTP错误的完整回溯和描述,并将添加的代码记录到WSGI脚本文件中以转储
np.\uuuuu文件\uuuuu
。计算出从何处导入
numpy
。尝试打印模块的文件位置时添加了错误。如果将其转储,您会得到什么
dir(np)
?您的描述听起来不正确。这与
pip
无关,它受运行
pip
时为您的帐户设置的
umask
的控制。典型的
umask
0022
。这将导致文件仍然可读,目录仍然可读且可执行(可搜索)。那应该很好。只有当您将
umask
更改为限制性更强的内容,从而将可执行位留给其他人时,才会出现问题。