【问题标题】:Executing a Python script in Apache2在 Apache2 中执行 Python 脚本
【发布时间】:2012-02-27 01:35:45
【问题描述】:

我正在尝试使用 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

【问题讨论】:

  • 从技术上讲,CGI 脚本不会在 in httpd... 中运行
  • 我知道它们没有在实际文件中运行,因为它是一个配置文件...
  • 不,它们不在同一个进程中运行; CGI 程序作为单独的进程运行。

标签: python apache cgi


【解决方案1】:

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

<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(至少在我的情况下,这对你来说也是一样的)。

这是一个python3版本的hello world脚本:

#!/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 解释器混合使用,反之亦然。

【讨论】:

  • 是的,我知道第一行与问题没有任何关系,我应该将它映射到特定目录但是,我现在的主要目标是让它工作.你的建议没有奏效。可能是脚本本身的问题,因为日志中还有一个错误说标题过早结束
  • 实际上,我认为我的 sn-p 确实有效,但现在的问题是您的脚本本身。看来apache对回车字符感到震惊。尝试更简单的测试,我只是附加到我的主要帖子中。
  • 顺便说一句,你不应该同时启用 mod_python 和 mod_wsgi,它们不兼容。它们中的每一个都需要不同的部署配置。而您现在尝试做的事情,也就是将 python webapp 部署为 cgi 脚本,不需要它们中的任何一个。因此,您可以禁用它们以减少误导性干扰的风险。
  • 所以 apache 不会让我运行第二个脚本,我不知道为什么,因为我完全按照你说的做了。第三个脚本也不会运行,但是当我使用 ./ 从命令行运行它时,我在第一个打印语句之前收到 syntax error near unexpected token print'` 的错误。如果我通过使用“python”调用它来运行它,那么它工作得很好。我认为 shebang 有问题,但我不确定它可能是什么。
  • 先生,您拯救了我的一天。我认为“订单”和“全部允许”部分救了我。谢谢你,先生。请过好每一天
【解决方案2】:

回复:执行格式错误。

我自己之前也遇到过几次。我收到了完全相同的(神秘的)错误消息。

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

经过一番挫折,我发现此问题与行尾有关,您需要将 Windows 行尾 (\r\n) 转换为 UNIX 行尾 (\n)。

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

【讨论】:

  • 只是部分回应,但希望它可以帮助一些可怜的草皮谷歌搜索问题。
  • 作为替代方案,您可以在大多数 Linux 系统上使用 dos2unix 工具。此命令行实用程序扫描指定文件并转换所有行尾(可能还有其他一些东西,但行尾很重要)。
【解决方案3】:

**适用于 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

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

【讨论】:

    【解决方案4】:

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

    #!/usr/bin/python3
    

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

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

    【讨论】:

      【解决方案5】:

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

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

      加载所需的模块看起来有点像这样。如果重启服务器会给你一个找不到文件的错误,请找出文件所在的位置,并相应地调整路径。

      LoadModule cgi_module modules/mod_cgi.so

      【讨论】:

        【解决方案6】:

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

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

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

        我注意到你并没有发布 javascript、html 或任何你用来调用脚本的东西。也许你可以为我们发布它?我从博客站点直接复制/粘贴示例,而没有查看我复制的内容。那是我的错误。

        【讨论】:

        • 如果 Apache 提供服务器端脚本,这不是客户端问题。客户应该不能直接访问它们。
        • 我已经有一段时间没有发布这个答案了。在我的问题中,我从客户端调用服务器端方法,这需要了解客户端的方法名称。这不是我设计的项目。在这种情况下,它部分是客户端问题。 (它是一个网络应用程序,而不是我正在开发的网站)Opera 在网络标准方面是最符合标准的,因此安装 Opera 可以帮助调试问题,尤其是基于浏览器的问题。
        最近更新 更多