我有一个简单的C程序,它的工作方式如下: 请输入 打印 向另一个输入 重新打印读/写同时蟒蛇subprocess.Popen
现在IAM的使用Python来调用这个程序。
import subprocess
sobj = subprocess.Popen("./cprog", stdin = subprocess.PIPE, stdout = subprocess.PIPE)
sobj.stdin.write("2 3\n")
sobj.stdin.close()
sobj.stdout.read()
这工作正常。同沟通工作一样好。
但是,当我尝试做这样的事情,它不会工作
sobj = subprocess.Popen("./cprog", stdin = subprocess.PIPE, stdout = subprocess.PIPE)
sobj.stdout.readline()
sobj.stdin.write("2 3\n")
sobj.stdin.close()
sobj.stdout.read()
这里有几件事情: 我看见Pexpect的,但我认为我们应该给予提前问什么程序。 2.我可以重新打开关闭的子流程管道吗?使用
荫上面的脚本作为CGI,我不知道为什么,但subprocess.call不会在工作。谁能解释为什么?
编辑:
荫做一个基于Web的项目,用户使用C,C++或Java编写代码并执行他们的浏览器。所以我首先想到了使用PHP,但我找不到一种方法来调用程序并以交互方式运行它们。然后我看到了python子进程模块。当我使用subprocess.call时,在解释器中一切正常。但是,将它保存为.cgi并在浏览器中打开它时,它不起作用。然后我开始查看subprocess.popen。但是,我需要在开始时输入所有输入,然后运行代码。我想要做的是在浏览器中运行一个交互式会话。
编辑2: 所以我想要的是用户在浏览器中运行程序,并在需要时输入文本框中输入,并将输入重定向到子进程的标准输入和基于它的输出。
编辑3:cprog.c
#include <stdio.h>
int main() {
int x;
printf("Enter value of x: \n");
scanf("%d", &x);
printf("Value of x: %d\n", x);
return 0;
}
只说 “是行不通的”,是永远不会有帮助;你必须告诉我们你想要发生什么,以及实际发生了什么。 (两次)。另外,这似乎是介于3到6个不同的问题之间,并且不清楚他们大多数都在问什么,所以我不确定你期望得到的答案是什么。 – abarnert
清楚的答案是一个明确的问题:“我可以重新打开关闭的子流程管道吗?”没有。在Python中没有“重新打开”API文件和文件类对象,或者它基于C或POSIX标准。如果关闭文件,则无法再使用它。所以,只有在完成之前不要关闭它。 (如果你已经关闭它,因为你可能会立即提前退出函数,但问题是你可能不会退出,正确的解决方案是使用'finally(f)'或'try' /'finally '在罕见的情况下,这是不适当的。) – abarnert
[这是答案的基础](http://stackoverflow.com/a/11729467/4279)*“我想要做的是运行交互式会话在浏览器中。“*问题。 'client.py'只是将其输入文本转换为大写,而不是使用某种编程语言对其进行解释。 – jfs