python 获取 subprocess 中的标准输出流结果

本文介绍了一种使用Python子进程模块执行特定脚本的方法,并从脚本的标准输出中捕获分析结果,最终以JSON格式返回。注意命令的正确传递方式及避免使用shell=True。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# encoding=UTF-8

import subprocess

class AnomalyResult:
    def GET(self):
        p = subprocess.Popen(['python', 'analysis/xx_analyze.py'], stdout=subprocess.PIPE)
        sub_stdout = p.stdout.read().decode('gbk')
        for i in sub_stdout.split('\n'):
            if i.startswith('##xxx_fail_json:'):
                ps_fail_info = eval(i.strip('##xxx_fail_json: '))
        web.header('Content-Type', 'application/json')
        return json.dumps(ps_fail_info)

“”"
[‘python’, ‘analysis/iv_analyze.py’] # 执行的命令是一个列表, 否则可能会报 FileNotFoundError: [WinError 2] 系统找不到指定的文件
shell 不能设置为True
subprocess.PIPE 把标准输出保存到管道中,可以通过 p.stdout.read() 读取出来。 # pring 等打印的信息会随之返回
目的是脚本 iv_analyze.py 的标准输出中获取分析的返回结果,结果再以 json 数据格式返回
“”"

<think>嗯,用户现在的问题是如何使用Pythonsubprocess模块调用Linux命令并捕获输出结果。我需要仔细分析他们的需求,结合之前的回答和提供的引用来给出最佳解答。 首先,用户之前已经询问过类似的问题,我给出了四种方法,其中推荐使用subprocess模块。现在他们特别关注subprocess的具体使用,所以需要详细展开这部分。引用[1]、[2]、[3]、[4]、[5]都提到了subprocess的不同用法,比如run()、Popen(),还有如何处理输出和错误。 用户可能希望看到清晰的步骤和示例代码,特别是如何正确捕获stdout和stderr。之前的回答中提到了subprocess.run和Popen的区别,这里需要再次强调。同时,用户可能遇到的一些常见问题,比如实时输出处理、参数传递的安全性、错误处理等,都需要涵盖进去。 要注意用户可能对subprocess的参数不太熟悉,比如shell=True的安全隐患,或者text=True的作用。引用[4]提到了shell=True的安全性问题,需要在回答中提醒用户。另外,引用[5]中的实时输出处理是一个常见需求,应该给出示例,比如使用Popen逐行读取输出。 还要考虑代码示例的完整性和正确性,比如是否需要检查返回码,如何处理异常。引用[5]中的错误处理方式可以作为参考,比如捕获FileNotFoundError,并记录日志。 最后,要确保回答结构清晰,分步骤说明,并附上相关问题,帮助用户深入理解。可能需要比较不同方法,如run()和Popen()的适用场景,让用户根据需求选择合适的方法。</think>根据Python官方推荐标准和实际开发经验,以下是通过subprocess模块调用Linux命令并捕获输出的完整解决方案: ### 一、基础执行模式(推荐方案) ```python import subprocess # 基础调用示例 result = subprocess.run( ['ls', '-l', '/tmp'], # 命令参数列表 capture_output=True, # 自动捕获stdout/stderr text=True, # 自动转换二进制输出为字符串 check=True # 非零返回码触发异常[^1] ) print(f"命令输出:\n{result.stdout}") ``` ### 二、进阶功能实现 #### 1. 实时输出处理(适合长时间运行命令) ```python with subprocess.Popen( ['ping', '-c', '4', 'example.com'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True ) as proc: while True: output = proc.stdout.readline() if not output and proc.poll() is not None: break if output: print(output.strip()) if proc.returncode != 0: raise RuntimeError(f"命令执行失败,错误码: {proc.returncode}")[^5] ``` #### 2. 带超时控制的执行 ```python try: result = subprocess.run( ['sleep', '10'], timeout=5, # 设置5秒超时 capture_output=True, text=True ) except subprocess.TimeoutExpired: print("命令执行超时,强制终止") ``` #### 3. 环境变量控制 ```python custom_env = {'PATH': '/usr/local/bin:' + os.environ['PATH']} subprocess.run( ['myapp'], env=custom_env, # 自定义环境变量 capture_output=True ) ``` ### 三、最佳实践建议 1. **参数安全传递** 使用参数列表而非字符串拼接,避免注入风险: ```python # 危险写法(可能被注入) subprocess.run(f"ls {user_input}", shell=True) # 安全写法 subprocess.run(['ls', sanitized_input])[^4] ``` 2. **错误处理规范** ```python try: result = subprocess.run( ['grep', 'ERROR', 'log.txt'], capture_output=True, check=True ) except subprocess.CalledProcessError as e: print(f"命令失败,错误码: {e.returncode}") print(f"错误输出: {e.stderr}") ``` 3. **编码处理技巧** 处理二进制输出时指定编码: ```python result = subprocess.run( ['file', '-b', 'unknown.bin'], capture_output=True ) print(result.stdout.decode('utf-8', errors='replace')) ``` ### 四、方法对比 | 方法 | 适用场景 | 输出捕获 | 实时处理 | 异常控制 | |-------------------|--------------------------|---------|---------|---------| | run() | 简单命令执行 | ✅ | ❌ | ✅ | | Popen() | 持续输出/交互式命令 | ✅ | ✅ | ❌ | | check_output() | 仅需标准输出时 | ✅ | ❌ | ✅ |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值