如何通过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文件。

+0

检查apache用户有权限执行文件('苏 - user_running_apache蟒蛇/home/pi/test.py ')。另外,最好包含python解释器的完整路径。 –

+0

而不是只使用'call'并忽略结果,请尝试'check_call'或'check_output',并打印,记录或以其他方式记录发生的情况。 – abarnert

与此问题:

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