Объект Os.PathLike - работа с файлом, отправленным через curl - PullRequest
0 голосов
/ 30 января 2019

Я хочу свернуть POST-файл в приложении фляги с помощью:

curl -X POST http://url_of_lambda_function.com -F 'file=@/path/to/file.pdf'

В приложении фляги есть исполняемый файл pdftotext, выполняемый через подпроцесс.Обычно для этого требуется пара параметров, поэтому ...

result = subprocess.call([pdftotext, "-layout", file, "-"])

, где pdftotext - это путь к исполняемому файлу, "-layout" - это опция, файл - это путь к pdf ('/ path/to/file.pdf ') и' - '- это вывод (в этом случае сбросьте его на экран).

МОЯ ПРОБЛЕМА:

В моей колбеприложение, у меня нет пути к файлу, как указано выше.Вместо этого я обрабатываю входящий файл следующим образом:

data = request.files['file']
file = data.read()

Данные - это объект-файл werkzeug, а файл имеет класс 'bytes'.Pdftotext принимает строки, байты или объекты типа os.Path.

Подача файла вместо /path/to/file.pdf выдает ошибку:

ValueError: embedded null byte

Преобразование файла в строку иподача дает еще одну ошибку:

OSError: [Errno 7] Argument list too long: 'pdftotext'

Я пытался обернуть это как объект BytesIO, объект StringIO и IOTextWrapper, но попался с ошибкой:

TypeError: expected str, bytes or os.PathLike object

Итак, янемного застрял!В результате у меня остается только возможность указать путь к файлу, которого у меня нет при отправке файла через curl!

МЫСЛИ:

  • IМожно загрузить файл во временное хранилище и передать по пути.Это работает, но замедляет работу функции, поэтому, если это возможно, лучше избегать этого!
  • Есть ли какой-то другой вид оболочки, которую я использую, которая имитирует объект os.PathLike или конвертирует, генерирует временный путь ??

Любая помощь очень ценится!

1 Ответ

0 голосов
/ 31 января 2019

решено

Спасибо Дэну Д. в комментариях к вопросу за предложение использовать NamedTeoraryFile ().

tmpfile = tempfile.NamedTemporaryFile()
tmpfile.write(file)
result = subprocess.call([pdftotext, "-layout", tmpfile.name, "-"])

Также получил некоторое использование изпереход на subprocess.run для сохранения выходных данных в переменной следующим образом:

result = subprocess.run(['pdftotext',tmpfile.name,'-'],stdout=PIPE,stderr=PIPE)
text = result.stdout
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...