Python subprocess执行脚本无法捕获输出到缓冲区问题咨询
代码错误说明
你的subprocess实现拿不到输出,是4个核心问题导致的:
- 传参格式错误:当你用列表形式给subprocess传命令参数时,每个参数必须拆成独立的列表元素,不能把参数名和参数值拼成同一个字符串。你现在写的
"--endpoint {0}".format(endpoint_ipaddr)会被当成一个完整的参数传给脚本,脚本根本识别不到--endpoint选项和对应的IP值,运行逻辑本身就异常。 - 脚本触发逻辑不对:你原来的os.system调用是传了
--output-file参数让脚本写文件,现在调用时既没适配这个参数的依赖,也没告诉脚本要往标准输出打印结果。很多这类脚本默认只有在不传--output-file时才会打印结果到终端,甚至部分脚本强制要求传--output-file,这种情况不做适配自然抓不到输出。 - 调试代码写错:你写的
print("creds")是打印固定字符串"creds",不是打印存储结果的creds变量,就算拿到了内容也看不到。 - 方法选型错误:
subprocess.call()本身就设计为只返回进程退出码,不会捕获标准输出内容,用这个方法本来就拿不到脚本输出。
修正后的可运行代码
import subprocess creds = subprocess.run( [ "/pathToScript/myscript.sh", "--endpoint", endpoint_ipaddr, "--register", reg_token, # 如果脚本强制要求必须传入--output-file参数,就放开下面这行注释 # "--output-file", "/dev/stdout" ], check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, # 同步捕获错误输出,方便运行异常时排查问题 text=True # Python3.7+推荐用text=True替代旧版universal_newlines=True,效果完全一致 ).stdout.strip() # 用strip()去掉输出首尾多余的换行、空白字符 print(creds)
补充验证说明
如果改完还是拿不到内容,先手动在终端执行不带--output-file的脚本命令,确认是否会直接在终端打印结果:
/pathToScript/myscript.sh --endpoint 测试IP --register 测试token
- 如果执行后提示缺少
--output-file参数,就把代码里注释的"--output-file", "/dev/stdout"加上,让脚本把本来要写入文件的内容直接输出到标准输出,subprocess就能正常捕获。 - 用列表传参时不需要手动给reg_token加单引号转义,subprocess会自动处理参数内的特殊字符,手动加引号反而会把单引号当成token的一部分传给脚本,导致注册鉴权失败。
内容的提问来源于stack exchange,提问作者skk6
相关产品推荐
相关产品推荐

