我必须在大约300个目录上运行一个工具.每次运行大约需要1分钟到30分钟甚至更长时间.所以,我写了一个python脚本,有一个循环,一个接一个地在所有目录上运行该工具.
我的python脚本有类似的代码:
for directory in directories:
os.popen('runtool_exec ' + directory)
Run Code Online (Sandbox Code Playgroud)
但是当我运行python脚本时,我反复收到以下错误消息:
..
tail: write error: Broken pipe
date: write error: Broken pipe
..
Run Code Online (Sandbox Code Playgroud)
我所做的就是使用ssh登录远程服务器,其中保存工具,python脚本和主题目录.当我使用以下命令从命令提示符单独运行该工具时:
runtool_exec directory
Run Code Online (Sandbox Code Playgroud)
它工作正常.只有当我使用python脚本运行时,"破管"错误才会出现.任何想法,解决方法?
我使用以下函数在Python中运行命令:
def run_proc(cmd):
child = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = child.communicate()
returncode = child.returncode
return stdout, stderr, returncode
Run Code Online (Sandbox Code Playgroud)
它一直工作正常,但现在我正在尝试使用该yes程序将输出管道输出到stdin.我正在尝试运行的命令如下:
yes '' | apt-get -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" dist-upgrade
Run Code Online (Sandbox Code Playgroud)
但我相信它可以用一般的例子代替,例如:
yes | head -3 | cat
Run Code Online (Sandbox Code Playgroud)
我的问题是,如果我尝试运行其中的任何命令yes |,上面的subprocess.Popen将包含错误消息:
yes: standard output: Broken pipe
yes: write error
Run Code Online (Sandbox Code Playgroud)
对我来说,似乎管道仍然可以工作,从yes | head -3 | cat答案中可以看出:y y y.
我有以下问题:
我有一个很长的单行shell命令可以被Python调用.代码是这样的:
# "first way"
def run_cmd ( command ):
print "Run: %s" % command
subprocess.call (command, shell=True)
run_cmd('''sort -n -r -k5 {3} |head -n 500|awk 'OFS="\t"{{if($2-{1}>0){{print $1,$2-{1},$3+{1},$4,$5}}}}' > {2}'''.format(top_count,extend/2,mid,summit))
Run Code Online (Sandbox Code Playgroud)
这些代码有效,但总是这样抱怨:
sort: write failed: standard output: Broken pipe
sort: write error
awk: (FILENAME=- FNR=132) fatal: print to "standard output" failed (Broken pipe)
Run Code Online (Sandbox Code Playgroud)
根据之前的回答,我需要使用更长的脚本来完成此操作,例如:
# "second way"
p1 = Popen("sort -n -r -k5 %s"%summit, stdout=PIPE)
p2 = Popen("head -n 500", stdin=p1.stdout, stdout=PIPE)
# and so on ..........
Run Code Online (Sandbox Code Playgroud)
我的问题是:
(1)"第二路"是否比"第一路"慢
(2)如果我必须以"第一路"写作(因为它写得更快),我怎么能避免这样的抱怨 …