为什么我的scanf捕获了我从Popen给出的顺序
简而言之:我想让我的scanf(必须是scanf)从Python读取输入,该怎么做?
我在Python里有一个文件
import subprocess
import sys
process=subprocess.Popen(["canCHandleIt.exe"],stdout=subprocess.PIPE)
res=process.communicate(2)
print res[0]
我的目标很简单。我想让我的C程序获取数字“2”,然后根据我的C代码打印两次“成功”。
#include <stdio.h>
int main(){
int x;int o;
scanf("%d",&x);
for (o=0;o<x;o++){
printf("Sucsess!");
}
}
但是它就是停在那里。当然,如果我手动输入数字2,它就能正常工作,但我希望我的scanf能够自动运行,不需要人来干预。
有人可能会建议我用C语言中和Python的sys.stdin.readline()
相对应的方式,但我真的希望我的scanf能独立工作。(我之所以问这个问题,是因为我看到很多人在比赛中使用scanf,我想在Python中复现比赛机器人的功能。)
你可以假设我已经用gcc编译了我的C文件。
1 个回答
4
试试这个:
import subprocess
import sys
process=subprocess.Popen(["canCHandleIt.exe"], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
res=process.communicate('2')
print res[0]
...主要的区别在于把 stdin=subprocess.PIPE
传给了 Popen()
,还有就是把 "2" 作为字符串传入,而不是 int
类型,放进 communicate()
里。
在 communicate()
的文档中说明:
可选的输入参数应该是一个字符串,用来发送给子进程……
而且
注意,如果你想把数据发送到进程的标准输入(stdin),你需要用 stdin=PIPE 来创建 Popen 对象。