Skip to main content
 首页 » 编程设计

Python popen 不适用于 block 设备

2025年05月04日14mengfanrong

我正在编写一个到目前为止看起来像这样的小型取证应用程序

import time, os,sys 
 
def getter(): 
    filename = sys.argv[1] 
    print "File Entered: " + filename 
    os.system('file ' + filename) 
    print "\n" 
    pipe =  os.popen("xxd " + filename, "r") 
    print pipe.read() 

我通过命令行输入一个文件,它打印出文件的类型,然后它应该在管道名称“pipe”下创建一个从终端返回到 python 应用程序的管道。然后我读了名为“pipe”的管道

这适用于较小的文本文件,但它不适用于 block 设备,即使我以 super 用户身份运行此应用程序也是如此。最后,这将根据 xxd 的输出恢复文件。

任何提示,谢谢。

请您参考如下方法:

我假设您已经在 shell 提示符下尝试了相同的命令,并且它运行良好,即使在通过管道传输到 less 或类似的东西时也是如此。

我有一种强烈的感觉,使用 subprocess将修复此行为;此模块取代了已弃用的 popen 调用,并在运行命令和从执行的命令获取结果方面提供了很大程度的灵 active 。

output = Popen(["xxd", "file"], stdout=PIPE).communicate()[0] 

尝试在它自己的 shell 下运行该进程,并读取它的管道。如果这仍然不起作用,请确保为其缓冲区大小设置一个合理的限制,并确保您没有使用 communicate 这会让您等到进程终止(处理时很长时间 block 设备)。

如果我的答案不起作用,请评论它,并尝试准确描述哪里出了问题 - 是卡住、没有输出还是损坏的结果?