Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python子流程输入被读取两次_Python_Io_Subprocess_Stdin - Fatal编程技术网

Python子流程输入被读取两次

Python子流程输入被读取两次,python,io,subprocess,stdin,Python,Io,Subprocess,Stdin,我需要用python包装一个程序,并为其提供输入和打印输出。但是,如果它给它一行输入,它似乎会使用它作为输入,直到程序终止。我用C编写了一个非常基本的程序(称为inout),它接收两行输入并输出到stdout from subprocess import Popen, PIPE, STDOUT p = Popen(['inout'], stdout=PIPE, stdin=PIPE, stderr=STDOUT) out, err = p.communicate(input=b'Why is

我需要用python包装一个程序,并为其提供输入和打印输出。但是,如果它给它一行输入,它似乎会使用它作为输入,直到程序终止。我用C编写了一个非常基本的程序(称为inout),它接收两行输入并输出到stdout

from subprocess import Popen, PIPE, STDOUT

p = Popen(['inout'], stdout=PIPE, stdin=PIPE, stderr=STDOUT)
out, err = p.communicate(input=b'Why is this twice')

print(out)
print("done")
该程序的输出为:

b'Why is this twice\r\nWhy is this twice\r\n'
done

我怎样才能阻止这种事情发生in变量,这意味着如果对
getline
的第二次调用没有返回任何内容(在您的情况下也没有,因为stdin的EOF是在第一次
getline
调用之后到达的),那么第一次
getline
调用返回的内容将打印两次,因为它们仍然保存在中的
中。如果你稍微修改C++程序,在中调用<代码> > GETLION>代码>:

,这是显而易见的。
#包括
使用名称空间std;
int main()
{
串入;
getline(cin,in);

C++的输入源是什么?;好吧,这实际上解决了它。由于某种原因,最初的程序在windows中运行时做了它应该做的事情。无论如何,我现在遇到了一个新问题,即程序在没有收到下一行输入的情况下终止,它只是假设它是一个空行并完成。有什么提示吗?@Jens您需要实际发送两行到e stdin通过
p.communicate
。或者,如果您确实希望
cin
调用之一是交互式的,您不需要使用
p.communicate(输入=…)
,而是直接将第一行馈送到
p.stdin
(使用
p.stdin.write(b'Why is this twitter?')
),让Python脚本在自己的stdin上请求第二行,然后将输入的行馈送给子进程
等待子程序完成并获取其标准输出。实际上,我需要在第一行之后接收子程序的输出,然后再给它第二行。您对如何执行此操作有任何意见吗?感谢迄今为止的所有帮助!啊,谢谢!希望我有代表投票支持您!:)
b'Why is this twice'


done
from subprocess import Popen, PIPE, STDOUT

p = Popen(['./inout'], stdout=PIPE, stdin=PIPE, stderr=STDOUT, bufsize=0)  # bufsize=0 keeps stdout from being buffered.

# Send first line to inout
p.stdin.write(b'Why is this twice\n') 

# Read first line out output
first = p.stdout.readline()
print("got {}".format(first))

# Get line from user
a = input()

# Send second line to inout
p.stdin.write('{}\n'.format(a).encode('utf-8')) 

# Read second line from inout
second = p.stdout.readline()
print('also got {}'.format(second))

p.wait()
print("done")
got b'Why is this twice\n'
sdf  # This was typed by me
b'sdf\n'
done