如何通过cgi启动服务器端python程序?

时间:2014-01-19 02:04:57

标签: python apache cgi raspberry-pi

我在我的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文件。

1 个答案:

答案 0 :(得分:0)

这个问题:

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”作为其第0个参数)运行它,这就是您想要的。

它可能仍然不起作用 - 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