В проекте 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/*
входной текст создается внутри программы Python, которая продолжает работать после захвата вывода identify_stuff
,Естественный выбор для вызова внешней команды - это subprocess.run()
.
стандартной библиотеки. Из соображений производительности я бы хотел избежать создания файла на диске.Есть ли способ сделать это с помощью инструментов subprocess
?Параметры stdin
и input
subprocess.run
не будут работать, потому что внешняя команда игнорирует STDIN и, в частности, требует аргумент имени файла.
* На самом деле, это инструмент: https://github.com/jakelever/Ab3P/blob/master/identify_abbr.C