Избегайте временных файлов при вызове suprocess.run () - PullRequest
0 голосов
/ 21 мая 2019

В проекте 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...