Python中subprocess的call方法为何输出0而非路径?
嘿,这个问题我刚学Python的时候也踩过坑!让我给你掰扯清楚~
为啥会出现这种情况?
你用的subprocess.call()方法,它的返回值根本不是命令执行的输出内容,而是命令的退出状态码——0就代表命令执行成功,非0一般是出错了。所以你把这个状态码转成字符串写入文件,test.txt里自然只有0啦。
至于pwd的输出会跑到控制台,是因为call()默认会让子进程的标准输出直接“继承”当前Python进程的输出流(也就是你的终端),所以输出直接显示出来,根本没被存到path变量里。
正确的姿势应该是这样
如果你想捕获命令的输出内容,得用专门用来抓输出的方法,比如subprocess.check_output()或者更推荐的subprocess.run()(Python 3.5及以上可用):
方法1:用subprocess.check_output()(简单直接)
from subprocess import check_output # text=True 直接返回字符串(不用手动解码),strip()去掉输出末尾的换行符 path = check_output('pwd', text=True).strip() with open('test.txt', "w") as f : f.write(path) # 划重点:用with语句管理文件的话,不需要手动调用f.close()! # with块结束时Python会自动帮你关闭文件,更安全
方法2:用subprocess.run()(更灵活,能处理错误)
from subprocess import run # capture_output=True 捕获 stdout 和 stderr,text=True 返回字符串 result = run('pwd', capture_output=True, text=True) # 先检查命令是否执行成功 if result.returncode == 0: path = result.stdout.strip() with open('test.txt', "w") as f : f.write(path) else: # 如果命令出错,可以打印错误信息 print(f"执行命令时出错了: {result.stderr}")
小提醒
用with语句处理文件是Python的最佳实践,它会自动帮你管理文件句柄,避免忘记关闭文件导致的问题,所以千万别画蛇添足手动调用f.close()啦~
内容的提问来源于stack exchange,提问作者innervoice
相关产品推荐
相关产品推荐

