Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.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脚本中调用子流程,应该适应变量内容,并收集结果_Python_Subprocess - Fatal编程技术网

从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']
如果你不想,你不必拆分它,但我同意上面的海报中关于如何处理这个问题的观点