我有一个设置,我有一个子进程,我想以交错的方式将文本通过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,也要附加。