我有以下简短命令:
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
但是,这是最好的方式吗?如何收集结果?
答案 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']
如果你不愿意,你不必拆分它,但我同意上面的海报就如何处理这个问题。