Apache2.4 python cgi bin脚本在Windows和Linux之间的可移植性
我目前正在Windows上本地开发,但需要将文件上载到Linux服务器。但是,我遇到了一个问题,我需要在每个文件的顶部包含一个shebang来告诉Apache要运行哪个python应用程序,这在Windows和Linux上自然会有所不同,因此我需要在将文件上载到Linux时更改所有文件。有没有一种方法可以消除对shebang的需求,或者提供一个在Windows和Linux下都能工作的shebang 我的httpd.confApache2.4 python cgi bin脚本在Windows和Linux之间的可移植性,python,apache,wsgi,shebang,Python,Apache,Wsgi,Shebang,我目前正在Windows上本地开发,但需要将文件上载到Linux服务器。但是,我遇到了一个问题,我需要在每个文件的顶部包含一个shebang来告诉Apache要运行哪个python应用程序,这在Windows和Linux上自然会有所不同,因此我需要在将文件上载到Linux时更改所有文件。有没有一种方法可以消除对shebang的需求,或者提供一个在Windows和Linux下都能工作的shebang 我的httpd.conf <IfModule wsgi_module> Loa
<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>
-->在Windows上,我得到了预期的结果:
Heelolo ->>>>>>>>
如果我不包括shebang,例如:
print("Content-Type: text\html\n")
print("Heelolo ->>>>>>>>")
我在apache error.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应用程序。见:
<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>
条件意味着只有在模块已经加载的情况下才会应用这些指令。问题是该模块是在该检查中加载的,因此显然不会加载该模块。尽管您尝试加载mod_wsgi,但您弄错了,并且没有告诉Apache托管任何wsgi应用程序。您还没有将Python web应用程序转换为WSGI应用程序。见:
<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>
条件意味着只有在模块已经加载的情况下才会应用这些指令。问题是模块是在该检查中加载的,因此显然不会加载。您有什么问题?如何在不使用Apache命令行的情况下运行?Windows上当前的i代码和Windows中的shebang:#!C:\Python\Python36-32\Python.exe。我将在Linux上发布ex:#!usr/python/-->我不希望在发布代码时更改每个文件*.py!tks!我试图编辑你的问题,使其更清楚;我很想完全删除WSGI,因为如果您通过cgi调用所有python脚本,这看起来像是在转移视线,但Graham的回答毫无意义,他有一个合理的观点,使用mod_WSGI不是最糟糕的想法;从个人经验来看,django(它可以运行在mod_wsgi之后,但如果我在Windows上运行它进行开发,我可能会使用内置的开发服务器)运行得很好,而不需要修复Windows和Linux之间的冲突。你有什么问题?如何在不使用Apache命令行的情况下运行?Windows上当前的i代码和Windows中的shebang:#!C:\Python\Python36-32\Python.exe。我将在Linux上发布ex:#!usr/python/-->我不希望在发布代码时更改每个文件*.py!tks!我试图编辑你的问题,使其更清楚;我很想完全删除WSGI,因为如果您通过cgi调用所有python脚本,这看起来像是在转移视线,但Graham的回答毫无意义,他有一个合理的观点,使用mod_WSGI不是最糟糕的想法;根据个人经验,django(它可以在mod_wsgi后面运行,不过如果我在Windows上运行它进行开发,我可能会使用内置的开发服务器)运行得很好,而不需要修复Windows和Linux之间的问题
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"