在Apache2中执行Python脚本

时间:2012-02-04 23:23:38

标签: 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!"

的httpd.conf:

AddHandler cgi-script .cgi .pl
AddHandler python-program .py

我知道它有一个小的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

此错误适用于我未编写的其他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

6 个答案:

答案 0 :(得分: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>

附录1

根据我的上一条评论,请尝试使用此脚本。它应该吐出有关cgi环境的信息。

#!/usr/bin/python
import cgi
cgi.test()

附录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!")

附录3

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

Order allow,deny
Allow from all

哪个可以帮到你:

<Directory /path/to/sample.py />
  Options +ExecCGI
  AddHandler cgi-script .py
  Order allow,deny
  Allow from all
</Directory>

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

ls -al /usr/bin/python*

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

/usr/bin/python -> python3*
/usr/bin/python2.6*  
/usr/bin/python3*  

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

/usr/bin/python -> python2.6*
/usr/bin/python2.6*  

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

#!/usr/bin/python2.6

# enable debugging
import cgitb
cgitb.enable()

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

print "Hello World!"

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

答案 1 :(得分:3)

Re: Exec格式错误。

我之前曾经多次遇到这种情况。我有完全相同(神秘)的错误信息。

我正在开发Python(3)脚本,通过我的Windows机器上的Notepad ++中的CGI使用,然后将它们上传到我的Linux服务器。

非常沮丧之后,我发现此问题与行结尾有关,您需要将Windows行结尾(\ r \ n)转换为UNIX行结尾(\ n)< /强>

在Notepad ++(6.1.5)中,您可以通过转到编辑菜单并选择 EOL转换选项然后保存文件来实现此目的。

答案 2 :(得分:1)

**适用于apache2版本2.4

sudo apt-get install python
sudo apt-get install apache2
  

编辑文件/etc/apache2/conf-enables/serve-cgi-bin.conf

====评论旧部分并在下面添加代码:

ScriptAlias /cgi-bin/ /var/www/cgi-bin/
<Directory "/var/www/cgi-bin">
AddHandler cgi-script .py
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>

=========================================

  

编辑文件/etc/apache2/apache2.conf   ***添加以下代码:

<Directory "/var/www/cgi-bin">
AllowOverride None
Options ExecCGI
Order allow,deny
Allow from all
</Directory>

<Directory "/var/www/cgi-bin">
Options All
</Directory>

<Directory /usr/local/apache2/cgi-bin>
Require all granted
</Directory>

请注意!

use for apache2.4 
  file python keep in directory: /var/www/cgi-bin/
  You can test :go to http://localhost/cgi-bin/<namefile>.py

referrence https://www.linux.com/blog/configuring-apache2-run-python-scripts

答案 3 :(得分:0)

就我而言,这是一个微不足道的问题。我不得不添加这一行:

#!/usr/bin/python3

到我想要运行的每个.py文件的顶部。

然后,一切都开始正常工作。

答案 4 :(得分:0)

我有相同的症状,与上面的答案相比,我的配置看起来还不错。

我发现我的新安装未配置为加载mod_cgi.so

加载所需模块看起来有点像这样。如果重新启动服务器会出现找不到文件的错误,请确定文件相应地调整路径的位置。

LoadModule cgi_module modules/mod_cgi.so

答案 5 :(得分:-5)

我假设您使用的是Firefox。我在网上的其他地方读到它可能与安装在机器上的firefox插件有关。

我收到了这个错误,我使用的是firefox 20.切换到Opera,我没有得到任何更多的错误,python脚本似乎执行得很好。

编辑:它实际上是一个我忽略的eval()方法调用,它将“(”和“)”附加到导致我失败的脚本结果中。一旦我删除它们,它对我有用。

我注意到你没有发布javascript,html或者你用来调用脚本的任何东西。也许你可以为我们发布它?我在博客网站上做了一个直接复制/粘贴示例,但没有查看我复制的内容。那是我的错误。