在Apache2中执行Python脚本

tpa*_*r44 12 python apache cgi

我正在尝试使用Apache执行Python程序.但是,Apache只会提供文件而不会实际执行它.该文件的权限是r/w/x,它是在/var/www.我将发布后面的内容httpd.conf和程序代码.我也尝试将python脚本作为.cgi文件运行但是也没有用.我也将这些mod_pythonmod_wsgi模块加载到apache中.

Python示例:

#!/usr/bin/python

# enable debugging
import cgitb
cgitb.enable()

print "Content-Type: text/plain\r\n\r\n"
print

print "Hello World!"
Run Code Online (Sandbox Code Playgroud)

httpd.conf中:

AddHandler cgi-script .cgi .pl
AddHandler python-program .py
Run Code Online (Sandbox Code Playgroud)

我知道它是一个小的httpd.conf文件但是当我安装apache时,文件中没有任何内容.我还要提一下,这只是为了让我学习在apache中运行python的基础知识.它不适合生产.谢谢您的帮助!

编辑

我正在使用的操作系统是Ubuntu 10.04,apache的版本是2.我有python版本2.6,它在#!/usr/bin/env python调用时自动使用.
我收到两个主要错误,第一个是即使文件和文件夹的权限是777,也找不到文件.日志中的错误是

[Sun Feb 05 13:29:44 2012] [error] [client 192.168.1.3] File does not exist: /var/www/poit-0.1
Run Code Online (Sandbox Code Playgroud)

这个错误是针对我没写的不同的python脚本.奇怪的是,当从浏览器窗口访问时,文件显示在文件夹的索引中.但是,当我导航到该文件时,我收到上述错误.

我得到的另一个错误是标头的过早结束.错误如下:

[Sun Feb 05 12:10:19 2012] [error] (8)Exec format error: exec of '/var/www/pyth.py' failed
[Sun Feb 05 12:10:19 2012] [error] [client 192.168.1.3] Premature end of script headers: pyth.py
Run Code Online (Sandbox Code Playgroud)

yla*_*idi 18

httpd.conf的第一行AddHandler cgi-script .cgi .pl 是无关紧要的,因为你正在测试python脚本而不是perl脚本.你应该在你的python脚本的位置定义那些指令,并告诉apache它应该在那个位置执行cgi脚本:Options +ExecCGI.这个片段将是一个开始:

<Directory /path/to/sample.py />
  Options +ExecCGI
  AddHandler cgi-script .py
</Directory>
Run Code Online (Sandbox Code Playgroud)

附录1:

根据我上次的评论,试试这个脚本.它应该吐出有关cgi环境的信息.

#!/usr/bin/python
import cgi
cgi.test()
Run Code Online (Sandbox Code Playgroud)

附录2:

我让你的脚本使用上面的配置.问题是脚本是用python2编写的.并且默认的解释器apache正在调用来执行脚本,是python3(至少在我的情况下,这也可能对你来说也是一样).

这是hello world脚本的python3版本:

#!/usr/bin/env python

# enable debugging
import cgitb
cgitb.enable()

print("Content-Type: text/plain;charset=utf-8")
print()

print("Hello World!")
Run Code Online (Sandbox Code Playgroud)

附录3:

对于第一个错误,请确保正确设置您尝试部署的任何目录和文件的权限和所有权.并尝试将这些指令添加到httpd.conf:

Order allow,deny
Allow from all
Run Code Online (Sandbox Code Playgroud)

哪个会给你这个:

<Directory /path/to/sample.py />
  Options +ExecCGI
  AddHandler cgi-script .py
  Order allow,deny
  Allow from all
</Directory>
Run Code Online (Sandbox Code Playgroud)

对于第二个错误,除非我遗漏了某些东西,看起来apache正在调用python 3解释器来执行你的脚本.要排除这种可能性,您可以尝试以下方法:

ls -al /usr/bin/python*
Run Code Online (Sandbox Code Playgroud)

这将列出您系统上可用的python解释器.如果您有多个解释器,您将获得类似于此输出的内容:

/usr/bin/python -> python3*
/usr/bin/python2.6*  
/usr/bin/python3*  
Run Code Online (Sandbox Code Playgroud)

如果没有,那就是这个输出:

/usr/bin/python -> python2.6*
/usr/bin/python2.6*  
Run Code Online (Sandbox Code Playgroud)

要确保这不是您遇到的问题,请尝试使用此修改后的示例脚本:

#!/usr/bin/python2.6

# enable debugging
import cgitb
cgitb.enable()

print "Content-Type: text/plain\r\n\r\n"
print

print "Hello World!"
Run Code Online (Sandbox Code Playgroud)

您会注意到我明确提到了apache应该调用的解释器版本,这很丑陋.但是为了测试,你可以做到.当然,您应该映射#!/usr/bin/python2.6到服务器上的二进制文件,并确保不要将python 3可复制代码与python 2解释器混合使用,反之亦然.