mod_wsgi找不到模块apache、RHEL、python3.4

2024-04-25 21:01:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我在RHEL/Apache2.4/python3.4/Django1.11/virtualenv上运行良好。然后,我在virtualenv中使用pip将numpy从1.14.0升级到1.14.2,安装pandas,并安装几个其他模块。然后我重新启动了Apache,并开始获取指示AttributeError: 'module' object has no attribute 'arange' when trying to call numpy.arange的服务器错误,或者在尝试调用时出现类似的错误matplotlib.使用(“Agg”)等

我换了wsgi.py用下面的方法,效果很好。一旦我取消对numpy或matplotlib调用的注释,它就会返回一个500错误,并且在apache错误日志中显示一个类似于AttributeError: 'module' object has no attribute ...的错误

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公司名称:

^{pr2}$

阿帕奇人httpd.conf没有改变。相关线路:

^{3}$

我不知道是什么原因造成的。我知道这通常发生在mod\wsgi被编译为错误版本的python时。但这之前工作得很好,一切似乎仍然配置正确:mod\wsgi正在运行,来自wsgi.py指示它正在使用正确版本的python,并且virtualenv的site packages目录位于python路径中。在

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

我还要查什么?在

应该系统可执行文件指向virtualenv而不是主python安装?{cdi>应该重新开始吗?在

另外,为了安装pandas,我必须安装Cython,这要求我安装gcc-c++(sudo yum install gcc-c++)。会有什么影响吗?在

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

来自Apache的HTTP错误页:

内部服务器错误

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

请联系服务器管理员 root@localhost告诉他们这个错误发生的时间, 以及在此错误发生之前您所执行的操作。在

有关此错误的详细信息可能可用 在服务器错误日志中。在

Apache错误日志(请注意,我在这里发布之前已删除了IP地址):

[Thu Jul 12 23:01:15.664941 2018] [wsgi:error] [pid 21490] [remote 10.x.x.x:59961] mod_wsgi (pid=21490): Exception occurred processing WSGI script '/usr/local/virtualenvs/myapp/wsgiapp/wsgi.py'.
[Thu Jul 12 23:01:15.727450 2018] [wsgi:error] [pid 21490] [remote 10.x.x.x:59961] Traceback (most recent call last):
[Thu Jul 12 23:01:15.727814 2018] [wsgi:error] [pid 21490] [remote 10.x.x.x:59961]   File "/usr/local/virtualenvs/myapp/wsgiapp/wsgi.py", line 14, in application
[Thu Jul 12 23:01:15.727831 2018] [wsgi:error] [pid 21490] [remote 10.x.x.x:59961]     a = np.arange(15).reshape(3, 5)
[Thu Jul 12 23:01:15.727865 2018] [wsgi:error] [pid 21490] [remote 10.x.x.x:59961] AttributeError: 'module' object has no attribute 'arange'

尝试显示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)=['__doc__', '__loader__', '__name__', '__package__', '__path__', '__spec__']

所以它不会出错,但它不是标识符的完整列表。从virtualenv解释器运行dir(np)会导致:

['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']))

为了确保wsgi/python确实找到了numpy包,我更改了wsgi.py文件来导入一个不存在的包import foo as np,当我再次运行它时,它错误地出现了ImportError: No module named 'foo'。所以它看起来确实是在寻找网站包。。。只是没有把它们装满?在


Tags: pyimportnumpymodwsgioutputremoteusr
1条回答
网友
1楼 · 发布于 2024-04-25 21:01:13

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

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

相关问题 更多 >