Han*_*Sun 3 python linux shell subprocess process
我有一个很长的单行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)如果我必须以"第一路"写作(因为它写得更快),我怎么能避免这样的抱怨 broken pipe
(3)我不应该以"第一种方式"写出最令人信服的理由
shell = True如果输入数据来自不受信任的来源,则使用可能会带来安全风险.例如,如果您的mid变量的内容是什么"/dev/null; rm -rf /".在你的场景中似乎不是这种情况,所以我不会太担心它.
在您的代码中,您将结果awk直接写入文件名mid.要调试问题,您可能希望在python程序中使用subprocess.check_output和读取awk调用的结果.
cmd = """sort -n -r -k5 %s |
head -n 500|
awk 'OFS="\t"{{if($2-{1}>0){{print $1,$2-{1},$3+{1},$4,$5}}}}'""".format(summit, top_count)
subprocess.check_call(cmd, shell=True, stdout=file)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4191 次 |
| 最近记录: |