subprocess.Popen 循环吃内存
subprocess.Popen eats memory while on loop
我写了一个 python 脚本来帮助我自动化我正在处理的项目。它在循环中执行一个 Capstone 子进程,因为当时我无法安装绑定,从二进制文件读取 4 个字节并将其作为 Capstone 输入传递。
问题是,我的二进制数据超过了 30MB,导致这个脚本运行了一段时间。所以我放了几分钟,当我回来时,我的 RAM 使用率为 98%。
我已经开始使用 Capstone 绑定,但我很好奇这里出了什么问题。我的代码如下。谢谢!
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()
编辑:修复了代码。我是凭记忆写的,所以有点乱。
您在一遍又一遍地启动过程后忘记将 popen.kill()
或 popen.terminate()
添加到 kill/terminate 过程。
在最后的 while
中添加 popen.kill()
或 popen.terminate()
应该会杀死剩余的进程。
我写了一个 python 脚本来帮助我自动化我正在处理的项目。它在循环中执行一个 Capstone 子进程,因为当时我无法安装绑定,从二进制文件读取 4 个字节并将其作为 Capstone 输入传递。
问题是,我的二进制数据超过了 30MB,导致这个脚本运行了一段时间。所以我放了几分钟,当我回来时,我的 RAM 使用率为 98%。
我已经开始使用 Capstone 绑定,但我很好奇这里出了什么问题。我的代码如下。谢谢!
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()
编辑:修复了代码。我是凭记忆写的,所以有点乱。
您在一遍又一遍地启动过程后忘记将 popen.kill()
或 popen.terminate()
添加到 kill/terminate 过程。
在最后的 while
中添加 popen.kill()
或 popen.terminate()
应该会杀死剩余的进程。