【问题标题】:How can I launch a serverside python program through cgi?如何通过 cgi 启动服务器端 python 程序?
【发布时间】:2014-01-19 02:04:56
【问题描述】:

我在我的 Raspberry Pi 上配置了 apache2 以启动 .py 文件,就像任何其他 cgi 文件一样,并且到目前为止有效。

我的目标是通过网站启动另一个python程序(它是本地的所以不用担心^^)

到目前为止我的代码在 cgi 文件中:

#!/usr/bin/python
import os, subprocess 

print "Content-type: text/html\n\n"
print "<h1>Test</h1>"
subprocess.call("python /home/pi/test.py")

我也试过 os.system 并且 cgi 文件工作正常,但它不执行 python 文件。

【问题讨论】:

  • 检查apache用户是否有权限执行文件(su - user_running_apache python /home/pi/test.py)。此外,最好包含 python 解释器的完整路径。
  • 不要只使用call 并忽略结果,而是尝试check_callcheck_output,并打印、记录或以其他方式跟踪发生的情况。

标签: python apache cgi raspberry-pi


【解决方案1】:

这个问题:

subprocess.call("python /home/pi/test.py")

它是不是从一个名为“python /home/pi/test.py”的可执行文件中查看您的PATH - 都是一个程序,名称中有空格。您想传递 参数列表,而不是命令行。正如the docs 解释:

args 是所有调用所必需的,并且应该是一个字符串,或一系列程序参数。提供一系列参数通常是首选,因为它允许模块处理任何所需的参数转义和引用(例如,允许文件名中的空格)。如果传递单个字符串,则 shell 必须是 True(见下文),否则字符串必须简单地命名要执行的程序而不指定任何参数。

所以,这样做:

subprocess.call(["python", "/home/pi/test.py"])

这将寻找一个名为“python”的可执行文件,并使用“/home/pi/test.py”作为它的第一个参数(并使用“python”作为它的第零个参数)运行它,这就是你想要的。

它可能仍然无法工作——python 必须位于您的特殊 Apache 用户的 PATH 上,通过可访问的路径和可执行文件。通常最好通过sys.executable"/usr/bin/python" 或任何合适的方式。

同时,如果您不只是调用call 并忽略结果,那么调试它会更容易(并非完全不可能)。例如:

ret = call(["python", "/home/pi/test.py"])
if ret:
    print "Running test.py returned", ret

……或……

try:
    check_call(["python", "/home/pi/test.py"])
except Exception as e:
    print "Tried to run test.py, got back", repr(e)

或者……你真的希望它的输出直接传递给 CGI?如果没有,您可能想要捕获它的输出并对其执行一些操作,如下所示:

try:
    output = check_output(["python", "/home/pi/test.py"])
except Exception as e:
    print "Tried to run test.py, got back", repr(e)
else:
    print "test.py said", output

【讨论】:

    猜你喜欢
    • 2015-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-22
    • 2015-08-04
    • 1970-01-01
    • 2018-08-05
    相关资源
    最近更新 更多