避免在调用suprocess.run()

时间:2019-05-21 12:17:15

标签: python subprocess

在Python项目中,我需要一个外部(非Python)命令的输出。 我们称之为identify_stuff。*

命令行方案

从命令行调用时,此命令需要文件名作为参数。 如果其输入是动态生成的,则无法将其通过管道传递到命令中-这不起作用:

cat input/* | ./identify_stuff > output.txt
cat input/* | ./identify_stuff - > output.txt

...它严格要求可以打开的文件名,因此需要在磁盘上创建一个临时文件以输出第一个命令,第二个命令可以从该文件读取数据。

但是,identify_stuff程序实际上仅在输入行上迭代一次,不涉及查找或重新读取。 因此,在Bash中,我们可以避免使用<(...)构造的临时文件。 这有效:

./identify_stuff <(cat input/*) > output.txt

这会将第一条命令的输出通过路径/dev/fdX传递到某个设备,该路径可用于打开流,例如磁盘上常规文件的路径。

实际情况:在Python中调用

现在,在Python程序内部创建了输入文本,而不仅仅是cat input/*,该文本在捕获identify_stuff的输出之后继续运行。 调用外部命令的自然选择是标准库的subprocess.run()

出于性能原因,我想避免在磁盘上创建文件。 subprocess工具有什么方法可以做到这一点? stdin的{​​{1}}和input参数将不起作用,因为外部命令会忽略STDIN,并且特别需要文件名自变量。


*实际上是这个工具:https://github.com/jakelever/Ab3P/blob/master/identify_abbr.C

0 个答案:

没有答案