我正在尝试使用Apache执行Python程序。但是,Apache只会提供文件而不会实际执行它。该文件的权限是r / w / x,它位于/var/www
。我将发布httpd.conf
的内容和之后的程序代码。我还尝试将python脚本作为.cgi
文件运行,但这样做也不行。我同时将mod_python
和mod_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
答案 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或者你用来调用脚本的任何东西。也许你可以为我们发布它?我在博客网站上做了一个直接复制/粘贴示例,但没有查看我复制的内容。那是我的错误。