subprocess.check_output函数介绍

前言

在 Python 中,subprocess 是一个非常强大的内置标准库。它的主要作用是在 Python 代码中执行外部的命令和程序(就像你在终端或命令行里敲命令一样)。

subprocess.check_output 是subprocess 模块中一个非常实用的便捷函数。它的核心作用是:执行外部命令,并直接返回该命令的标准输出(stdout)。如果命令执行失败(返回码非 0),它会自动抛出异常。

基本用法

默认情况下,check_output返回的是字节串(bytes),在python3中,我们通常会加上text=True,让它直接返回字符串。

python 复制代码
import subprocess
# 执行命令,获取输出
# text=True 会将返回的 bytes 自动解码为 str
output = subprocess.check_output(["echo", "Hello World!"], text=True)
print(output) 
# 输出: Hello World!

核心特性:自动检查错误(check)

函数名中的check意味着它会自动检查命令的退出状态码(returncode)。如果命令执行失败(比如命令拼错、文件不存在),它会抛出subprocess.CalledProcessError异常。

python 复制代码
import subprocess
try:
    # 尝试查看一个不存在的文件
    output = subprocess.check_output(["ls", "not_exist.txt"], text=True)
except subprocess.CalledProcessError as e:
    print(f"命令执行失败!")
    print(f"返回码: {e.returncode}")
    print(f"原本的命令: {e.cmd}")

处理标准错误 (stderr)

默认情况下,check_output只返回标准输出(stdout)。如果命令产生了错误信息(stderr),这些错误信息会直接打印到屏幕上,而不会被包含在返回的变量中。

如果你相把错误信息也一并合并到输出结果中,可以使用stderr=subprocess.STDOUT

python 复制代码
import subprocess
# 将 stderr 合并到 stdout 中一起返回
output = subprocess.check_output(
    ["ls", "not_exist.txt"], 
    stderr=subprocess.STDOUT, 
    text=True
)

实战1

python 复制代码
import subprocess

# 1. 定义执行单条 SQL 的函数
def run_query(cmd):

    # 使用 check_output,如果 SQL 报错会自动抛出 CalledProcessError
	try:
		output = subprocess.check_output(cmd, universal_newlines=True)
		return output.strip()
	except subprocess.CalledProcessError as e:
        print(f"Error executing Hive query: {e.output}")
        sys.exit(1)	
		
# 主方法
def main():
    #table ='test.table_test'
    #day ='2026-01-01'
    # 待查询的语句
    query = f"SELECT count(1) FROM {table} WHERE day = {day} "
    queue_name = "root.queue.xa"


    cmd = [
    'spark3-sql', 
    '--queue', queue_name, 
    '-e', query]


# 执行查询
    query_result = run_query(cmd)
    print(query_result)

if __name__ == "__main__":
    main()

实战2

python 复制代码
import subprocess
import concurrent.futures


# 1. 定义执行单条 SQL 的函数
def run_query(query,queue_name='root.queue.xa'):

    cmd = [
    'spark3-sql', 
    '--queue', queue_name, 
    '-e', query]

    # 使用 check_output,如果 SQL 报错会自动抛出 CalledProcessError
	try:
		output = subprocess.check_output(cmd, universal_newlines=True)
		return output.strip()
	except subprocess.CalledProcessError as e:
        print(f"Error executing spark-sql query: {e.output}")
        sys.exit(1)	


# 2. 定义并发执行多条 SQL 的主函数
def run_queries_concurrent(queries_dict, max_workers=3):
    results = {}

    # 使用 ThreadPoolExecutor 进行并发
    with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor:
        # 提交所有任务
        future_to_query = {
            executor.submit(run_query, sql): key 
            for key, sql in queries_dict.items()
        }

        # 获取结果 (as_completed 会在任务完成时立刻产出)
        for future in concurrent.futures.as_completed(future_to_query):
            key = future_to_query[future]
            try:
                # 设置超时时间(例如 3600 秒),防止任务永久卡死
                results[key] = future.result(timeout=3600)
                print(f"任务 [{key}] 执行成功!")
            except Exception as e:
                print(f"任务 [{key}] 发生未知错误: {e}")

    return results

# 主方法
def main():

# 准备你的 SQL 字典
    my_queries = {
        "task_1": f"SELECT count(1) FROM test.table_test where day ='2026-06-01' ",
        "task_2": f"SELECT count(1) FROM test.table_test where day ='2026-06-02' ",
        "task_3": f"SELECT count(1) FROM test.table_test where day ='2026-06-03' "
    }


    print("开始并发执行 Spark SQL 任务...")


    # 执行并发任务 (最多同时跑 3 个)
    final_results = run_queries_concurrent(my_queries, max_workers=3)


    print("-" * 30)
    print(f"🎉 所有任务执行完毕!总耗时: {end_time - start_time:.2f} 秒")
    task_1_count = int(final_results['task_1'].strip())
    task_2_count = int(final_results['task_2'].strip().split('\t')[0])
    task_3_count = int(final_results['task_3'].strip().split('\t')[0])

    # 打印结果
    print(f'task_1_count:{task_1_count}')
    print(f'task_2_count:{task_2_count}')
    print(f'task_3_count:{task_3_count}')

if __name__ == "__main__":
    main()
相关推荐
TheBestRucy1 小时前
RAG知识库问答系统落地:从向量检索到上下文增强的全链路实践
人工智能·python·langchain·aigc·交互
AOwhisky1 小时前
Python 学习笔记(第十四期)——运维自动化(下·中篇):远程文件传输——paramiko进阶篇
运维·python·学习·云原生·自动化·文件传输·paramiko
其实防守也摸鱼2 小时前
补天SRC新手入门指南:从0到1的漏洞挖掘之路
网络·python·学习·安全·web安全·数据挖掘·挖洞
lupai2 小时前
手机在网状态查询 API 新手实战指南
大数据·python·智能手机
其美杰布-富贵-李2 小时前
Spring Boot 依赖注入说明文档
java·spring boot·python
梦想的初衷~3 小时前
植被遥感反演与数据同化算法体系教程:从PROSAIL前向模拟到作物估产
人工智能·python·机器学习·作物模型·遥感数据同化·prosail·植被参数反演
LadenKiller3 小时前
近期AI协作写量化规则,要按阶段安排任务
人工智能·python
天天进步20153 小时前
Python全栈项目--基于深度学习的图像超分辨率系统
开发语言·python·深度学习
ellenwan20264 小时前
近期AI协作量化实现,先补规则清晰度和流程完整性
人工智能·python