Zeroth, зачем тебе popen
readelf
вместо использования libelf
или чего-то подобного? Быстрый поиск "elf" в PyPI показывает множество возможностей. Вы их просмотрели?
Во-первых, на многих платформах все операции ввода-вывода в конечном итоге будут проходить через кеш, так что это не сильно замедлит работу, даже если в конечном итоге все будет сброшено на диск только для того, чтобы удалить его (что может никогда не произойти). делать). Осторожное использование mmap
часто может помочь избежать сброса на диск, но вам это может даже не понадобиться.
Так что на самом деле я бы сначала протестировал его и посмотрел, действительно ли чрезмерный ввод-вывод замедляет вас. Если нет, перестаньте об этом беспокоиться.
Если вы хотите быть уверены, что дисковый ввод-вывод отсутствует (я предполагаю, что вы отключили все подкачки, потому что в противном случае эта идея изначально бессмысленна), самое простое решение — создать временный файл, который на самом деле не скопировано на диск.
Самый простой способ сделать это — создать виртуальный диск и просто поместить туда временные файлы.
Кроме того, на большинстве платформ есть способ создать временный файл, который либо никогда не копируется на диск, либо копируется на диск только в случае крайней необходимости. К сожалению, я не думаю, что какая-либо из функций stdlib Python может это сделать, и в этом случае вам придется писать для нее код для конкретной платформы.
Если вы хотите передать инструменту произвольный буфер как стандартный ввод, это легко сделать. Но вы должны знать, как указать инструменту читать стандартный ввод — часто это означает что-то вроде передачи -c
в качестве опции или -
в качестве поддельного имени файла, а иногда просто не передавать никаких имен файлов. Прочтите справочную страницу, чтобы узнать, какие именно. Например:
with zipfile.ZipFile(file,'r') as z:
with z.open(binary_path) as bin:
subprocess.Popen(['gzip','-dc'], stdin=bin)
К сожалению, некоторые инструменты не работают таким образом, часто потому, что им требуется доступный для поиска файл, а не просто поток. Я считаю, что readelf
является одним из них. Так что этот вариант недоступен.
И передача произвольного fd в инструмент требует, чтобы инструмент имел возможность принимать произвольные fd вместо имен файлов, чего большинство из них не делает.
person
abarnert
schedule
12.12.2012
bin
во временный файл на диске? В качестве альтернативы, можете ли вы использовать RAM-диск (если производительность является проблемой)? - person Andre Holzner   schedule 12.12.2012