从Python脚本中调用子流程,应该适应变量内容,并收集结果
我有以下简短的命令:从Python脚本中调用子流程,应该适应变量内容,并收集结果,python,subprocess,Python,Subprocess,我有以下简短的命令: echo "6005600401" >> tst1 && evm disasm tst1 我想在Python脚本中发布它。在某种意义上,它类似于一个简单的Bash脚本,它只收集到达控制台的输出。它生成的真实数据如下所示: 6005600401 000000: PUSH1 0x05 000002: PUSH1 0x04 000004: ADD 我想从Python脚本内部调用这个命令,并将它生成的数据收集到一个表示中,以便进一步处理 因此,我一直
echo "6005600401" >> tst1 && evm disasm tst1
我想在Python脚本中发布它。在某种意义上,它类似于一个简单的Bash脚本,它只收集到达控制台的输出。它生成的真实数据如下所示:
6005600401
000000: PUSH1 0x05
000002: PUSH1 0x04
000004: ADD
我想从Python脚本内部调用这个命令,并将它生成的数据收集到一个表示中,以便进一步处理
因此,我一直在研究子流程管理,并在python
控制台中熟悉它,如下所示:
>>> import subprocess
>>> subprocess.call("exit 1", shell=True)
1
>>> subprocess.check_output(["echo", "Hello World!"])
'Hello World!\n'
status = subprocess.call("ls" + " -l", shell=True)
似乎将该命令放入Bash脚本并执行并不困难,但关键是我需要更改由echo
调用的值,根据不同组件的结果,我还需要更改echo
输出到的文件
然后问题是,如何从Python脚本内部调用一个子进程,该脚本可以容纳不断变化的变量,然后将结果收集到一个可扩展的数据结构中
这是可行的
>>> status = subprocess.call("echo" + " '6005600401' >> tst2 && evm disasm tst2", shell=True)
6005600401
000000: PUSH1 0x05
000002: PUSH1 0x04
000004: ADD
但是,这是最好的办法吗?如何收集结果 如果您只是使用
echo
来写入文件……为什么不使用Python来写入文件呢
with open('tst2', 'w') as fd:
fd.write('6005600401\n')
status = subprocess.check_output(['evm', 'disasm', 'tst2'])
您甚至可以将其封装在函数中:
def my_test_func(filename, data):
with open(filename, 'w') as fd:
fd.write(data)
fd.write('\n')
return subprocess.check_output(['evm', 'disasm', filename])
status = my_test_func('tst2', '6005600401')
或者不使用命名文件,您可以研究
tmpfile
模块。如果您只是使用echo
写入文件……为什么不使用Python写入文件呢
with open('tst2', 'w') as fd:
fd.write('6005600401\n')
status = subprocess.check_output(['evm', 'disasm', 'tst2'])
您甚至可以将其封装在函数中:
def my_test_func(filename, data):
with open(filename, 'w') as fd:
fd.write(data)
fd.write('\n')
return subprocess.check_output(['evm', 'disasm', filename])
status = my_test_func('tst2', '6005600401')
或者,您可以研究tmpfile
模块,而不是使用命名文件。如何
check_out = lambda *cmd: subprocess.check_output(' '.join(map(str, cmd)), shell=True, executable='/bin/bash', stderr=subprocess.STDOUT).split()
c = 'echo {} >> {} && evm disarm {}'
然后您可以只使用字符串格式c
并执行以下操作:
check_out(c.format(*args))
['6005600401',
'000000: PUSH1 0x05',
'000002: PUSH1 0x04',
'000004: ADD']
如果你不想,你不必拆分它,但我同意上面的海报中关于如何实现这一点的观点。这个怎么样
check_out = lambda *cmd: subprocess.check_output(' '.join(map(str, cmd)), shell=True, executable='/bin/bash', stderr=subprocess.STDOUT).split()
c = 'echo {} >> {} && evm disarm {}'
然后您可以只使用字符串格式c
并执行以下操作:
check_out(c.format(*args))
['6005600401',
'000000: PUSH1 0x05',
'000002: PUSH1 0x04',
'000004: ADD']
如果你不想,你不必拆分它,但我同意上面的海报中关于如何处理这个问题的观点