如何在内存中的文件上运行python中的程序?

2024-04-25 18:16:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在处理数千个二进制文件,它们被包装在类似zip的文件容器中,从远程数据库中提取出来。我需要使用readelf之类的工具分析这些二进制文件的内容,但我希望避免在将二进制文件写入磁盘时引发不必要的IO。在

有没有办法调用子流程.Popen这样我就可以将内存中的文件传递给命令行实用程序,命令可以将其理解为文件?我已经尝试将文件描述符分配给stdin,但是实用程序没有按预期从stdin读取文件内容。在

with zipfile.ZipFile(file,'r') as z:
  with z.open(binary_path) as bin:
    subprocess.Popen(['readelf','-d'],stdin=bin)

我也尝试过直接将必要的参数设置为对文件描述符的引用,但这也被证明是徒劳的:

^{pr2}$

我所尝试的是可能的,还是应该直接写到磁盘并从那里进行分析?在

非常感谢!在


Tags: 文件实用程序内容bin远程aswithstdin
1条回答
网友
1楼 · 发布于 2024-04-25 18:16:36

第零,为什么你需要popenreadelf,而不是使用libelf或类似的东西?快速搜索"elf" at PyPI可以发现很多可能性。你看过了吗?在

首先,在许多平台上,所有的I/O最终都会经过缓存,所以它不会真正减慢您的速度,即使它最终确实会将所有内容都刷新到磁盘上以删除它(它可能永远不会这样做)。谨慎使用mmap通常可以帮助避免刷新磁盘,但您可能根本不需要它。在

所以说真的,我会先测试一下,看看过多的I/O是否真的会减慢你的速度。如果没有,就别再担心了。在

如果您想确保没有磁盘I/O(我假设您已经禁用了所有交换,否则这个想法一开始就毫无意义),最简单的解决方案是创建一个不实际备份到磁盘的临时文件。在

最简单的方法是创建一个ramdisk,并将临时文件放在那里。在

另外,大多数平台都有一种方法来创建一个临时文件,该文件要么从不备份到磁盘,要么只在绝对必要时才备份到磁盘。不幸的是,我认为任何stdlib Python函数都不能做到这一点,在这种情况下,您必须为它编写特定于平台的代码。在

如果您确实想将任意缓冲区作为stdin传递给工具,这很容易。但是您必须知道如何让工具经常读取stdin,这意味着像传递-c作为一个选项,或者{}作为一个假文件名,或者有时候只是不传递任何文件名。阅读手册页,看看是哪个。例如:

with zipfile.ZipFile(file,'r') as z:
    with z.open(binary_path) as bin:
        subprocess.Popen(['gzip','-dc'], stdin=bin)

不幸的是,有些工具不能这样工作,通常是因为它们需要一个可查找的文件,而不仅仅是一个流。我相信readelf就是其中之一。所以这个选项不可用。在

而将任意fd传递给工具需要该工具有一种方法来获取任意fd而不是文件名,而大多数文件名都没有

相关问题 更多 >