Как я могу передать результат распаковки с помощью gzip в процесс stdin, если у меня нет файла?

Я обнаружил, что конструктору Popen требуется аргумент stdin, чтобы быть объектом с методом fileno. В python2.7 gzip не имеет функции decompress. Кроме того, почему Popen не может принять файловый объект без fileno?

Я пробовал этот код

import subprocess
import gzip
import io

# To test with file
# with open('test.gz', 'rb') as f:
#    data = f.read()
data = b'...'

gz = gzip.GzipFile(mode='rb', fileobj=io.BytesIO(data))
subprocess.Popen(['cat'], stdin=gz)

Но есть ошибка:

Traceback (most recent call last):
  File "test.py", line 9, in <module>
    subprocess.Popen(['cat'], stdin=gz)
  File "/usr/lib/python3.7/subprocess.py", line 728, in __init__
    errread, errwrite) = self._get_handles(stdin, stdout, stderr)
  File "/usr/lib/python3.7/subprocess.py", line 1347, in _get_handles
    p2cread = stdin.fileno()
  File "/usr/lib/python3.7/gzip.py", line 334, in fileno
    return self.fileobj.fileno()
io.UnsupportedOperation: fileno

< Сильный > Добавлено: Можно использовать что-то отличное от Popen и / или subprocess

2
P. Dmitry 9 Окт 2019 в 12:48

1 ответ

Вы можете сохранить его в файл и передать путь к файлу конструктору Popen, я не уверен, работает ли он с модулем BytesIO.

Вы можете следовать этому вопросу о том, как сохранить вывод в файл. .

GLHF

0
xhenrique 9 Окт 2019 в 13:34
Подумал об использовании временного файла. Но это немного взломано
 – 
P. Dmitry
9 Окт 2019 в 13:49
Ошибка io.UnsupportedOperation: fileno относится к типу переменной, которую вы пытаетесь использовать с функцией fileno(), она работает только с fileObjects, он ожидает чего-то вероятного, а не io.BytesIO, как вы передаете. Я думаю, вам нужно создать файл, чтобы использовать модуль. По крайней мере, откройте его с помощью with, прочтите байты в файл и передайте файловую переменную в Popen.
 – 
xhenrique
9 Окт 2019 в 13:55
Да, я понимаю, почему существует ошибка. Но вопрос в том, почему Popen разрешает только файловые объекты с fileno и возможно ли каким-то образом передавать данные для обработки без файла. Может быть, без Popen или даже без subprocess
 – 
P. Dmitry
10 Окт 2019 в 08:34