Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Popen在循环中消耗内存_Python_Subprocess_Capstone - Fatal编程技术网

Python Popen在循环中消耗内存

Python Popen在循环中消耗内存,python,subprocess,capstone,Python,Subprocess,Capstone,我编写了一个python脚本来帮助我自动化正在进行的项目。它在循环中执行Capstone子进程,因为当时我无法获得要安装的绑定,从二进制文件中读取4个字节并将其作为Capstone输入传递 问题是,我的二进制数据超过了30MB,这导致这个脚本持续了一段时间。所以我让它保持几分钟,当我回来的时候,我的内存使用率是98% 我已经开始使用顶石装订,但我很好奇这里出了什么问题。我的代码如下。谢谢 import binascii import subprocess import sys def main

我编写了一个python脚本来帮助我自动化正在进行的项目。它在循环中执行Capstone子进程,因为当时我无法获得要安装的绑定,从二进制文件中读取4个字节并将其作为Capstone输入传递

问题是,我的二进制数据超过了30MB,这导致这个脚本持续了一段时间。所以我让它保持几分钟,当我回来的时候,我的内存使用率是98%

我已经开始使用顶石装订,但我很好奇这里出了什么问题。我的代码如下。谢谢

import binascii
import subprocess
import sys

def main():
    if len(sys.argv) != 3:
        print(sys.argv[0] + " [binary file] [output file]")
        sys.exit(1)
    hexdata = ""
    f = open(sys.argv[1], "rb")
    if f == None:
        print("Could not open file!")
        sys.exit(1)
    data = f.read()
    f.close()
    x = 0
    out = open(sys.argv[2], "a+")
    while x < len(data):
        for y in xrange(4):
            hexdata += binascii.hexlify(data[x])
            x += 1
        popen = subprocess.Popen(["cstool", "arm64", hexdata], stdout=subprocess.PIPE, universal_newlines=True)
        for line in iter(popen.stdout.readline, ""):
            out.write(line.rstrip()[13:])
        popen.stdout.close()
        hexdata = ""
    out.close()

if __name__ == "__main__":
    main()
导入binascii
导入子流程
导入系统
def main():
如果len(sys.argv)!=三:
打印(sys.argv[0]+“[二进制文件][输出文件]”)
系统出口(1)
hexdata=“”
f=打开(系统参数[1],“rb”)
如果f==无:
打印(“无法打开文件!”)
系统出口(1)
data=f.read()
f、 关闭()
x=0
out=打开(sys.argv[2],“a+”)
当x

编辑:修复了代码。我从内存中写了回来,所以我把它弄乱了一点。

您忘记添加
popen.kill()
popen.terminate()
在反复启动进程后终止/终止进程


中添加
popen.kill()
popen.terminate()
,而在末尾添加
popen.kill()
应该可以杀死剩下的进程。

尝试添加
popen.kill()
popen.terminate()
关闭
stdout
是的,成功了。我知道我忘了什么,哈哈。我会回答我自己的问题。我会把它写下来作为一个答案,这样我们就可以结束这个问题了。。。