为什么我的scanf捕获了我从Popen给出的顺序

0 投票
1 回答
777 浏览
提问于 2025-04-18 17:16

简而言之:我想让我的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 对象。

撰写回答