Linux环境下Python3如何向subprocess调用的命令传递变量
解决subprocess调用中传递IP变量的问题
你的问题核心在于直接把变量名写进了字符串字面量里——shell会把IP当成一个普通的主机名字符串,而不是你定义的变量值,所以才会抛出ping: unknown host IP的错误。下面给你两种正确的实现方式,更推荐第二种安全写法:
方式1:使用字符串格式化(保留shell=True)
如果你需要保留shell=True的用法,可以通过Python的字符串格式化把变量值注入到命令中,比如用Python3.6+支持的f-string:
#!/usr/bin/python3 import sys, os, logging import subprocess IP = '127.0.0.1' # 用f-string将IP变量值插入命令字符串 COMMAND = f"ping -c 3 {IP}" # subprocess.call的调用 subprocess.call(COMMAND, shell=True) # subprocess.Popen的调用,可解码输出结果 result = subprocess.Popen(COMMAND, stdin=subprocess.PIPE, stdout=subprocess.PIPE, shell=True).stdout.read() print(result.decode('utf-8'))
如果要兼容更老的Python版本,也可以用str.format()方法:
COMMAND = "ping -c 3 {}".format(IP)
方式2:拆分命令为列表(推荐,无需shell=True)
使用shell=True存在命令注入的安全风险,官方更推荐把命令拆分成列表形式,直接传递变量,完全不需要依赖shell解析:
#!/usr/bin/python3 import sys, os, logging import subprocess IP = '127.0.0.1' # 将命令拆分为列表,每个参数单独作为一个元素 COMMAND = ['ping', '-c', '3', IP] # subprocess.call的调用,无需shell参数 subprocess.call(COMMAND) # subprocess.Popen的调用,用communicate获取输出更规范 process = subprocess.Popen(COMMAND, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) stdout, stderr = process.communicate() # 打印标准输出和错误信息 print(stdout.decode('utf-8')) if stderr: print(stderr.decode('utf-8'))
这种写法不仅规避了安全风险,还能避免很多字符串转义的坑,是subprocess的标准用法。
内容的提问来源于stack exchange,提问作者Judy
相关产品推荐
相关产品推荐

