Apache 2.4 Python cgi-bin 脚本在 Windows 和 Linux 之间的可移植性



我目前正在Windows上进行本地开发,但需要将我的文件上传到Linux服务器。 但是,我遇到了一个问题,我需要在每个文件的顶部包含一个shebang,以告诉Apache要运行哪个python应用程序,这在Windows和Linux上自然会有所不同,因此我需要更改所有文件作为将它们上传到Linux的一部分。 有没有办法消除对shebang的需求,或者提供一个在Windows和Linux下都可以工作的shebang?

我的 httpd.conf

<IfModule wsgi_module>
    LoadFile "C:/Python/Python36-32/python36.dll"
    LoadModule wsgi_module "C:/Python/Python36-32/lib/site-packages/mod_wsgi/server/mod_wsgi.cp36-win32.pyd"
    WSGIPythonHome "C:/Python/Python36-32"
</IfModule>
<VirtualHost 127.0.0.1:80>
    DocumentRoot "C:/Python/Web"
    <Directory "C:/Python/Web">
        Allow from all
        Require all granted
        Options Indexes Includes ExecCGI FollowSymLinks
        AllowOverride All
        Order deny,allow
        DirectoryIndex index.py
    </Directory>
    AddHandler cgi-script .cgi .pl .py
</VirtualHost>

如果我的 index.py 包括 shebang,例如它看起来像:

#!C:PythonPython36-32python.exe
print("Content-Type: texthtmln")
print("Heelolo ->>>>>>>>")
-

-> 在Windows上,我得到了预期的结果:

Heelolo ->>>>>>>>

如果我不包括 shebang,例如:

print("Content-Type: texthtmln")
print("Heelolo ->>>>>>>>")

我在 apache 错误中收到以下消息.log

[Fri May 26 14:05:31.326900 2017] [win32:error] [pid 4700:tid 1972] [client 127.0.0.1:50743] AH02102: C:/Web/Hello/index.py is not executable; ensure interpreted scripts have "#!" or "'!" first line

任何想法如何跨平台完成这项工作?

尽管您尝试加载mod_wsgi,但您弄错了,并且无论如何都没有告诉Apache托管任何WSGI应用程序。你也没有将你的Python Web应用程序转换为WSGI应用程序。看:

  • http://modwsgi.readthedocs.io/en/develop/user-guides/quick-configuration-guide.html

还要去学习一个简单的Python Web框架,比如Flask,而不是尝试从头开始做事。

不过,在尝试之前,还要删除wsgi_module的条件。也就是说,而不是:

<IfModule wsgi_module>
    LoadFile "C:/Python/Python36-32/python36.dll"
    LoadModule wsgi_module "C:/Python/Python36-32/lib/site-packages/mod_wsgi/server/mod_wsgi.cp36-win32.pyd"
    WSGIPythonHome "C:/Python/Python36-32"
</IfModule>

您应该只是:

LoadFile "C:/Python/Python36-32/python36.dll"
LoadModule wsgi_module "C:/Python/Python36-32/lib/site-packages/mod_wsgi/server/mod_wsgi.cp36-win32.pyd"
WSGIPythonHome "C:/Python/Python36-32"

条件意味着只有在模块已经加载时才应用这些指令。问题是模块在该检查中加载,因此显然不会加载。

最新更新