Apache2.4 python cgi bin脚本在Windows和Linux之间的可移植性

Apache2.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

我目前正在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>
-->在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应用程序。见:

还可以学习一个简单的pythonweb框架,比如Flask,而不是从头开始尝试

但在尝试执行此操作之前,还要删除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应用程序。见:

还可以学习一个简单的pythonweb框架,比如Flask,而不是从头开始尝试

但在尝试执行此操作之前,还要删除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"