在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程序内部创建了输入文本,而不仅仅是cat input/*
,该文本在捕获identify_stuff
的输出之后继续运行。
调用外部命令的自然选择是标准库的subprocess.run()
。
出于性能原因,我想避免在磁盘上创建文件。
subprocess
工具有什么方法可以做到这一点?
stdin
的{{1}}和input
参数将不起作用,因为外部命令会忽略STDIN,并且特别需要文件名自变量。
*实际上是这个工具:https://github.com/jakelever/Ab3P/blob/master/identify_abbr.C