如何用subprocess抑制输出并将lock程序的QR码存入变量?
解决
os.system显示QR码且无法捕获输出的问题 我明白你现在的需求:执行./lock命令输入密码后,要把返回的QR码内容存到变量里,同时不想让QR码在终端显示出来。之前用os.system虽然能跑,但没法捕获输出还会乱打印,用subprocess.Popen又没搞对?别着急,我给你捋清楚正确的用法。
首先,os.system的问题在于它只是把命令丢给shell执行,输出直接打到终端,没法捕获,也没法轻易抑制。而subprocess模块提供了更精细的控制,核心是重定向输出流,同时捕获你需要的内容。
最简单的方案:用subprocess.check_output
这个方法专门用来捕获命令执行后的标准输出,而且默认会在命令执行失败时抛出异常,很适合你的场景:
import subprocess # 替换成你的密码 password = "your_secret_password" try: # 用列表形式传命令(安全,避免shell注入问题),捕获stdout,抑制stderr输出 qr_code_bytes = subprocess.check_output( ["./lock", password], stderr=subprocess.DEVNULL # 把错误输出丢去/dev/null,不会显示在终端 ) # 如果QR码是文本格式(比如ASCII字符画),转成字符串;如果是二进制图片就跳过decode qr_code_content = qr_code_bytes.decode("utf-8").strip() except subprocess.CalledProcessError: # 处理密码错误或者命令执行失败的情况 print("密码错误或命令执行失败!")
如果你非要用subprocess.Popen
之前你用Popen失败,大概率是没正确设置输出重定向。Popen是更底层的方法,需要手动处理进程的输出:
import subprocess password = "your_secret_password" # 启动进程,指定捕获stdout,抑制stderr process = subprocess.Popen( ["./lock", password], stdout=subprocess.PIPE, stderr=subprocess.DEVNULL ) # 等待进程结束,获取输出 qr_code_bytes, _ = process.communicate() # 转成字符串(按需调整) qr_code_content = qr_code_bytes.decode("utf-8").strip() # 可以检查进程的返回码,判断是否执行成功 if process.returncode != 0: print("密码错误或命令执行失败!")
关键注意点
- 不要用字符串拼接命令:比如
"./lock %s" % password这种写法,不仅容易因为密码里的特殊字符(比如空格、引号)出问题,还存在shell注入风险。推荐用列表形式["./lock", password],subprocess会自动处理参数的传递。 - 抑制输出的核心:通过
stderr=subprocess.DEVNULL把错误输出扔掉,stdout=subprocess.PIPE把标准输出捕获到内存里,这样终端就不会显示任何内容了。 - 输出格式处理:如果返回的QR码是二进制图片(比如PNG),就不要用
decode,直接保留qr_code_bytes变量即可;如果是ASCII字符画,转成字符串更方便后续处理。
这样调整后,你就能把QR码内容存到变量里,同时终端不会显示任何多余的输出啦~
内容的提问来源于stack exchange,提问作者cuilster
相关产品推荐
相关产品推荐

