Запуск командной строки из Python и передача аргументов из памяти - PullRequest
4 голосов
/ 19 сентября 2010

Мне было интересно, есть ли способ запустить исполняемый файл командной строки в python, но передать ему значения аргументов из памяти, не записывая данные из памяти во временный файл на диске.Из того, что я видел, кажется, что subprocess.Popen (args) является предпочтительным способом запуска программ из сценариев Python.

Например, у меня есть файл PDF в памяти.Я хочу преобразовать его в текст, используя функцию командной строки pdftotext, которая присутствует в большинстве дистрибутивов Linux.Но я бы предпочел не записывать pdf-файл в памяти во временный файл на диске.

pdfInMemory = myPdfReader.read()
convertedText = subprocess.<method>(['pdftotext', ??]) <- what is the value of ??

Какой метод мне следует вызывать и как я должен передать данные из памяти в первый вход и каналвывод его обратно в другую переменную в памяти?

Я предполагаю, что есть другие модули pdf, которые могут выполнять преобразование в памяти, и информация об этих модулях была бы полезной.Но для дальнейшего использования мне также интересно узнать, как передать ввод и вывод в командную строку изнутри python.

Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

2 голосов
/ 19 сентября 2010

с Popen.communicate :

import subprocess
out, err = subprocess.Popen(["pdftotext", "-", "-"], stdout=subprocess.PIPE).communicate(pdf_data)
2 голосов
/ 19 сентября 2010

os.tmpfile полезно, если вам нужна вещь для поиска. Он использует файл, но он почти такой же простой, как конвейерный подход, не требует очистки.

tf=os.tmpfile()
tf.write(...)
tf.seek(0)
subprocess.Popen(  ...    , stdin = tf)

Это может не работать в ОС Windows с поврежденной Posix.

1 голос
/ 19 сентября 2010

Popen.communicate из подпроцесса принимает входной параметр, который используется для отправки данных в стандартный ввод, вы можете использовать его для ввода своих данных. Вы также получаете вывод вашей программы из communicate, поэтому вам не нужно записывать его в файл.

Документация для связи явно предупреждает, что все находится в буфере в памяти, что, кажется, является именно тем, чего вы хотите достичь.

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