这是有关子流程的问题。
我正在使用此异步脚本来完成一些工作:https://github.com/ethereum/trinity/blob/master/scripts/peer.py
脚本的功能与我使用该脚本的方式无关。
由于它是异步的,因此我想在具有不同值的子进程中运行它,并且对于每个子进程,我想等待一定的超时时间,然后再检查脚本日志中的字符串。如果找到要查找的字符串,则退出该参数传递的子过程,然后传递一个新参数,重复该过程。
从高层次来看,这是我正在尝试的子流程脚本。
import subprocess
enode = 'enode://ecd3f3de6fc1a69fdbb459ccfeedb9ae4b@127.0.0.1:30303'
command = [
'python',
'-m',
'scripts.peer',
'-mainnet',
'-enode',
enode
]
proc = subprocess.Popen(command)
try:
outs, errs = proc.communicate(timeout=15)
except TimeoutExpired:
proc.kill()
outs, errs = proc.communicate()
print(outs)
print(errs)
此代码无效,并且永远不会退出脚本。如何在异步脚本中使用子流程,以便当我在子流程的日志中grep一个值并找到我要查找的值时将其暂停。
我要查找的日志中的字符串是:failed DAO fork check validation
,我将其用作停止脚本的触发器。
答案 0 :(得分:0)
您需要将子流程的输入和错误流显式设置为subprocess.PIPE
以便从中读取。
# ...
proc = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)