子过程:从许多地方写入一个输入管道

时间:2018-09-02 19:18:27

标签: python subprocess pipe cat buffering

我有一个设置,我有一个子进程,我想以交错的方式将文本通过stdin从Python内部和另一个子进程中以特定的顺序传递到该进程中,像这样({{1}仅用于使示例更易于编写):

shell = True

文件import subprocess if __name__ == '__main__': # only for testing/MWE: subprocess.run('echo "sdlfksldf" > bla', shell = True) subprocess.run('echo "werwerwerwoeiruwoe" > bla1', shell = True) # This is the relevant part; # cat'ing into foo here is just an example for the kind of process I have # (actually, it's pdflatex). proc = subprocess.Popen(['cat > foo'], stdin = subprocess.PIPE, shell = True, encoding = 'utf-8') proc.stdin.write('123') # 1 proc.stdin.flush() subprocess.run(['cat', 'bla', 'bla1'], stdout = proc.stdin) #2 proc.stdin.write('456') # 3 bla仅包含要放在Python生成的字符串之间的其他一些文本。这可以正常工作并产生包含

的文件bla1
foo

但是我想知道这是否真的是我应该这样做的方式。注意事项:

  • 我在123sdlfksldf werwerwerwoeiruwoe 456 stdin.write中使用communicate代替了# 1,尽管在文档中建议使用# 3,因为communicate终止了{{1} },这不是我想要的-那时我还没有写完。
  • 另一方面,如果没有proc,则flush()中的另一个过程首先完成,我得到# 2。但这看起来有点骇人听闻。
  • sdlfksldf\nwerwerwerwoeiruwoe\n123456中的过程实际上是# 2。目的是将大量现有文件附加到输入中,我认为这比通过Python循环打开和cat一切都更有效,尽管这样做可以解决刷新“问题”(只有一个过程)就会参与进来。)

简而言之,我不知道我是否知道自己在做什么...这是实现我的目标的合理而强大的方法吗?缓冲或阻塞有任何问题吗?

(如果对第三点的回答是“使用循环”,那么问题不仅仅在于write(read()),而且可以避免的话,问题仍然存在。)


总结一下真实程序应该做什么:我在从cat读到的第一个调用pdflatex中使用Popen而不是cat > foo。首先,我用Python生成一些LaTeX,并将其写入输入。然后,我从现有文件中添加很多内容;然后,我用Python制作了更多LaTeX,也要附加。

0 个答案:

没有答案