Я бег следующей версии Python:Как закрыть подпроцесс Python 2.5.2 Popen, когда у меня есть данные, которые мне нужны?
$ /usr/bin/env python --version
Python 2.5.2
Я бег следующего кода Python для записи данных из дочернего подпроцесса на стандартный вывод, и чтение, что в переменный Python под названием metadata
:
# Extract metadata (snippet from extractMetadata.py)
inFileAsGzip = "%s.gz" % inFile
if os.path.exists(inFileAsGzip):
os.remove(inFileAsGzip)
os.symlink(inFile, inFileAsGzip)
extractMetadataCommand = "bgzip -c -d -b 0 -s %s %s" % (metadataRequiredFileSize, inFileAsGzip)
metadataPipes = subprocess.Popen(extractMetadataCommand, stdin=None, stdout=subprocess.PIPE, shell=True, close_fds=True)
metadata = metadataPipes.communicate()[0]
metadataPipes.stdout.close()
os.remove(inFileAsGzip)
print metadata
прецедент следующим образом, чтобы тянуть первые десять строк стандартного вывода из упомянутого выше фрагмента кода:
$ extractMetadata.py | head
появится ошибка, если я труба в голову, AWK, Grep и т.д.
Сценарий заканчивается со следующей ошибкой:
close failed: [Errno 32] Broken pipe
Я бы подумал, закрывая трубы будет достаточно, но, очевидно, это не так.
Этот код отлично работает для меня после включения его использовать GZIP. Если вы просто распаковываете файлы gzip, почему вы используете неясный инструмент, о котором никто не знает («bgzip»)? Google считает, что на SF действует только летящий проект. Используйте zcat или, еще лучше, используйте модуль gzip. Вы вряд ли получите ответ на этот вопрос, если вы не предоставите образец кода, который воспроизводит проблему. –
Я отредактировал вопрос, чтобы показать, что используется случай, который запускает сломанную трубу. Кодекс, который я предоставил, должен быть достаточным, я думаю. Если я заменил «bgzip» на «gzip», я получаю ту же ошибку. Инструмент «bgzip» является частью набора SAMtools, который включает модифицированную версию «gzip», которая выполняет произвольный доступ в архиве. Надеюсь это поможет. –