繁体   English   中英

在python中运行复杂的命令行

[英]Running a complex command line in python

我想在Python中调用一个复杂的命令行并捕获它的输出,我不明白我应该怎么做:

我正在尝试运行的命令行是:

cat codegen_query_output.json | jq -r '.[0].code' | echoprint-inverted-query index.bin

据我所知:

process = subprocess.Popen(['ls', '-a'], stdout=subprocess.PIPE)
out, err = process.communicate()
print out

但这是一个简单的ls -a([cmd,args])任何想法我应该如何运行/构造我复杂的命令行调用?

最干净的方法是创建2个通过管道连接的子流程。 您不需要cat命令的子进程,只需传递打开的文件句柄:

import subprocess

with open("codegen_query_output.json") as input_stream:
    jqp = subprocess.Popen(["jq","-r",'.[0].code'],stdin=input_stream,stdout=subprocess.PIPE)
    ep = subprocess.Popen(["echoprint-inverted-query","index.bin"],stdin=jqp.stdout,stdout=subprocess.PIPE)
    output = ep.stdout.read()
    return_code = ep.wait() or jqp.wait()

jqp进程将文件内容作为输入。 其输出传递给ep输入。

最后我们从ep读取输出以获得最终结果。 return_code是两个返回码的组合。 如果出现问题,它与0不同(更详细的返回代码信息将分别进行测试)

此处不考虑标准错误。 它将显示在控制台上,除非设置了stderr=subprocess.STDOUT (与管道输出合并)

此方法不需要shell或shell=True ,因此它更具可移植性和安全性。

它需要一个shell来解释|这样的运算符 您可以要求Python运行shell,并将您的命令作为要执行的命令传递:

cmd = "cat test.py | tail -n3"                                                  
process = subprocess.Popen(['bash', '-c', cmd], stdout=subprocess.PIPE)         
out, err = process.communicate()                                                
print out        

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM