【问题标题】:Run a .exe file serverside by a CGI python script通过 CGI python 脚本在服务器端运行 .exe 文件
【发布时间】:2013-03-14 17:02:49
【问题描述】:

我有一个带有一个按钮的 html 文件。单击按钮时,将调用 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.exe)。 py 是另一个脚本,只是为了查看我的 apache 是否配置正常)。

我正在使用 wamp。

我想做的是一个更大的程序,它允许客户端连接到服务器,并与服务器端的程序“交互”。该程序已经用 c++ 完成,不会被翻译成 php 或 javascript。

编辑:我一直在尝试使用以下功能:subprocess.Popen、subprocess.call 和 os.system。我还测试了运行我在 apache/cgi-bin 文件夹中创建的 .exe 文件或在 c:\windows 中运行的可执行文件(如 wordpad)的代码。当 python 脚本从终端运行时它总是成功,而从浏览器尝试时它永远不会工作。是否可能是因为我使用的服务器?我使用 wamp 的 apache,并在 httpd.conf 文件中添加了语句“AddHandler cgi-script .exe”。

【问题讨论】:

  • 在您的 Javascript 代码中,您似乎在逗号前缺少了一个引号。
  • http://localhost/cgi-bin/helloworld.pyhttp://localhost/cgi-bin/run.py?
  • 谢谢,但是我把引号拼错了,也没有很好地解释我对 helloworld.py 的解释。现在认为已更正:)

标签: c++ python html cgi exe


【解决方案1】:

我确定它在本地不起作用。 os.system 返回命令的退出代码,而不是它的输出。

您将需要使用 subprocess.Popen 和管道输出来读取输出。

import subprocess
p = subprocess.Popen("whatever.exe",stdout=subprocess.PIPE)
print p.stdout.read()
p.wait()

此外,您的 CGI 脚本的输出不是有效的 HTTP 协议,并且取决于您的服务器,这可能会导致问题(一些服务器会清理脚本的输出,而另一些服务器则希望它们能够正确编写)。

对我而言,此代码示例有效(在使用 weborf 作为服务器的 GNU/Linux 上,但应该相同)。您可以尝试设置内容类型并发送 \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

【讨论】:

  • 我认为如果服务器运行该东西时“python”命令不在路径中,您的第一行也可能是一个问题。
  • 我正在使用 windows7、wamp 和 chrome/IE。为了避免在编写 exe 文件的路径时出现“斜线问题”,我使用的是 os.path.normpath("c:/wamp/.../cgi-bin/helloworld.exe)。目前我只有从 cygwin 终端调用它时能够运行 run.py。
  • 我的意思是#!python的路径,我什至不知道那个东西是否适用于windows。
  • #!python 没问题,因为我可以毫无问题地运行其他 python 程序
  • 非常感谢,终于可以使用您的代码了。问题是我正在调用一个没有结束的.exe,并且浏览器无限期地等待
【解决方案2】:

一般来说,我的经验是,如果某些东西在本地工作,而当您在不同的服务器上安装所有相同的代码时不起作用,那么您正在查看权限问题。检查您网站上的访问者拥有的权限,并确保通过您的 Web 服务器的用户具有运行 helloworld.exerun.py 的正确权限。

【讨论】:

  • 我已尝试授予脚本、.exe 和包含它们的文件夹 (/cgi-bin) 的读取、写入和执行权限,但没有任何改变。
猜你喜欢
  • 1970-01-01
  • 2013-03-30
  • 1970-01-01
  • 2020-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-27
  • 2011-09-30
相关资源
最近更新 更多