从Python脚本中调用子进程,应该适应变量内容,并收集结果

时间:2017-09-19 15:20:41

标签: python subprocess

我有以下简短命令:

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

但是,这是最好的方式吗?如何收集结果?

2 个答案:

答案 0 :(得分:2)

如果您只是使用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模块,而不是使用命名文件。

答案 1 :(得分:2)

这个怎么样?

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']

如果你不愿意,你不必拆分它,但我同意上面的海报就如何处理这个问题。