通过CGI Python脚本在服务器端运行.exe文件

0 投票
2 回答
2771 浏览
提问于 2025-04-17 18:07

我有一个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 个回答

0

一般来说,我的经验是,如果在本地运行正常,但把同样的代码安装到另一个服务器上却不行,那很可能是权限问题。你需要检查一下你网站访客的权限,确保通过你的网络服务器访问的用户有权限运行 helloworld.exerun.py

2

我敢肯定,这在本地是无法工作的。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

撰写回答