如何通过cgi启动一个serverside python程序?
问题描述:
我在我的Raspberry Pi上配置了apache2来启动.py文件,就像任何其他cgi文件一样,并且工作到目前为止。如何通过cgi启动一个serverside python程序?
我的目标是通过网站启动另一个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文件。
答
与此问题:
subprocess.call("python /home/pi/test.py")
是,它看起来通过你的PATH
来自名为“蟒蛇/home/pi/test.py"-all一个程序的可执行文件,名称中的空间。你想通过一个参数列表,而不是命令行。作为the docs解释:
ARGS所需的所有来电,应该是一个字符串,或者程序参数的顺序。提供一系列参数通常是首选,因为它允许模块处理任何所需的参数转义和引用(例如,允许文件名中的空格)。如果传递一个字符串,shell必须是
True
(见下文),否则字符串必须简单地命名要执行的程序而不指定任何参数。
所以,这样做:
subprocess.call(["python", "/home/pi/test.py"])
这将寻找名为“蟒蛇”的可执行文件,并以“/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
检查apache用户有权限执行文件('苏 - user_running_apache蟒蛇/home/pi/test.py ')。另外,最好包含python解释器的完整路径。 –
而不是只使用'call'并忽略结果,请尝试'check_call'或'check_output',并打印,记录或以其他方式记录发生的情况。 – abarnert