运行 Python 中的外部可执行文件以交互方式
Running an external executable in Python interactively
使用gcc test.c -o test.exe
编译一个简单的C程序:
/* TEST.C */
#include <stdio.h>
#include <string.h>
#define TRUE 1
int main (void)
{
char p[256];
strcpy(p, "start[=12=]");
printf("Welcome!\n");
while (TRUE)
{
printf("Input: ");
if (fgets(p, 255, stdin) == NULL) break;
if (p[0] == 'q') break;
printf("You Entered: %s\n", p);
}
return 0;
}
Python中的subprocess模块预示着启动一个程序并抓取它的stdin
和stdout
。使用上述程序进行简单测试:
import subprocess
from subprocess import PIPE, STDOUT
output = open("test.out","w")
ris = subprocess.Popen(executable="test.exe", args="", stdin=PIPE,
stdout=output, stderr=STDOUT,
universal_newlines=True, shell=True)
com = ris.communicate(input='bye\n')
com = ris.communicate(input='q\n')
output.close()
似乎在第一个通信命令上无限循环,用以下内容填充 test.out
:
Welcome!
You Entered: bye
You Entered: bye
You Entered: bye
You Entered: bye
.
.
.
直到用户中断python进程。使用 ris.stdin.write('bye\n')
而不是 communicate
似乎根本不会发送输入,即使后面跟着 ris.stdin.flush()
也是如此。
与 subprocess
交互 运行 可执行文件的正确方法是什么?目的是在后台留下程序 运行ning 的单个实例,同时通过 stdin
传入多个输入,并从 stdout
或 stderr
读取相应的输出
除了您的 C 程序中提到的错误之外,您还不止一次调用 .communicate()
。 .communicate()
是一次性函数,它将 所有 数据发送到子进程并等待子进程退出。
如果一定要用.communicate()
,这样用:
com = ris.communicate(input='bye\nq\n')
或者,您可以使用 ris.stdin.write()
,像这样:
import subprocess
from subprocess import PIPE, STDOUT
output = open("test.out","w")
ris = subprocess.Popen(executable="/tmp/test.exe", args="", stdin=PIPE,
stdout=output, stderr=STDOUT,
universal_newlines=True, shell=True)
com = ris.stdin.write('bye\n')
com = ris.stdin.write('q\n')
ris.stdin.flush()
output.close()
ris.wait()
使用gcc test.c -o test.exe
编译一个简单的C程序:
/* TEST.C */
#include <stdio.h>
#include <string.h>
#define TRUE 1
int main (void)
{
char p[256];
strcpy(p, "start[=12=]");
printf("Welcome!\n");
while (TRUE)
{
printf("Input: ");
if (fgets(p, 255, stdin) == NULL) break;
if (p[0] == 'q') break;
printf("You Entered: %s\n", p);
}
return 0;
}
Python中的subprocess模块预示着启动一个程序并抓取它的stdin
和stdout
。使用上述程序进行简单测试:
import subprocess
from subprocess import PIPE, STDOUT
output = open("test.out","w")
ris = subprocess.Popen(executable="test.exe", args="", stdin=PIPE,
stdout=output, stderr=STDOUT,
universal_newlines=True, shell=True)
com = ris.communicate(input='bye\n')
com = ris.communicate(input='q\n')
output.close()
似乎在第一个通信命令上无限循环,用以下内容填充 test.out
:
Welcome!
You Entered: bye
You Entered: bye
You Entered: bye
You Entered: bye
.
.
.
直到用户中断python进程。使用 ris.stdin.write('bye\n')
而不是 communicate
似乎根本不会发送输入,即使后面跟着 ris.stdin.flush()
也是如此。
与 subprocess
交互 运行 可执行文件的正确方法是什么?目的是在后台留下程序 运行ning 的单个实例,同时通过 stdin
传入多个输入,并从 stdout
或 stderr
读取相应的输出
除了您的 C 程序中提到的错误之外,您还不止一次调用 .communicate()
。 .communicate()
是一次性函数,它将 所有 数据发送到子进程并等待子进程退出。
如果一定要用.communicate()
,这样用:
com = ris.communicate(input='bye\nq\n')
或者,您可以使用 ris.stdin.write()
,像这样:
import subprocess
from subprocess import PIPE, STDOUT
output = open("test.out","w")
ris = subprocess.Popen(executable="/tmp/test.exe", args="", stdin=PIPE,
stdout=output, stderr=STDOUT,
universal_newlines=True, shell=True)
com = ris.stdin.write('bye\n')
com = ris.stdin.write('q\n')
ris.stdin.flush()
output.close()
ris.wait()