通过CGI Python脚本在服务器端运行.exe文件
我有一个HTML文件,里面有一个按钮。当点击这个按钮时,会调用一个叫“run”的JavaScript函数:
function run() {
window.open("http://localhost/cgi-bin/run.py", "_self");
}
run.py这个文件的作用是尝试运行一个叫做helloworld.exe的程序,这个程序会在终端输出“helloworld”这个字符串,但什么都没有发生,浏览器一直显示“等待localhost”的状态。
#!python
import sys, string, os, cgitb
cgitb.enable()
os.system("helloworld.exe")
我单独运行helloworld.exe是可以的,我在终端运行run.py也没问题,我还测试了浏览器中的测试网站http://localhost/cgi-bin/helloworld.py
,结果也很好(helloworld.py是另一个脚本,用来检查我的apache配置是否正确)。
我使用的是wamp。
我想做的是一个更大的程序,允许客户端连接到服务器,并与服务器上的程序“互动”。这个程序已经用C++写好了,不打算转换成PHP或JavaScript。
编辑:我尝试过使用subprocess.Popen、subprocess.call和os.system这些函数。我还测试了运行我自己在apache/cgi-bin文件夹里的.exe文件,或者像wordpad这样的可执行文件,放在c:\windows下。每次在终端运行Python脚本时都能成功,但从浏览器尝试时总是失败。这可能是因为我使用的服务器吗?我用的是wamp里的apache,并且在httpd.conf文件中添加了“AddHandler cgi-script .exe”这句话。
2 个回答
一般来说,我的经验是,如果在本地运行正常,但把同样的代码安装到另一个服务器上却不行,那很可能是权限问题。你需要检查一下你网站访客的权限,确保通过你的网络服务器访问的用户有权限运行 helloworld.exe
和 run.py
。
我敢肯定,这在本地是无法工作的。os.system 返回的是命令的退出代码,而不是它的输出。
你需要使用 subprocess.Popen,并把输出通过管道传递,这样才能读取到输出。
import subprocess
p = subprocess.Popen("whatever.exe",stdout=subprocess.PIPE)
print p.stdout.read()
p.wait()
另外,你的 CGI 脚本输出的内容并不是有效的 HTTP 协议,根据你的服务器设置,这可能会导致问题(有些服务器会清理脚本的输出,有些则希望它们写得正确)。
对我来说,这段代码示例在 GNU/Linux 上使用 weborf 作为服务器是可以工作的,但其他环境应该也差不多。你可以尝试设置内容类型,并发送 \r\n\r\n 这个结束序列。服务器通常不需要发送这个,因为 CGI 脚本可能还想添加一些其他的 HTTP 头信息。
#!/usr/bin/env python
import cgitb
import subprocess
import sys
cgitb.enable()
sys.stdout.write("Content-type: text/plain\r\n\r\n")
p = subprocess.Popen("/usr/games/fortune",stdout=subprocess.PIPE)
data = p.stdout.read()
p.wait()
print data