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