Python 2.6.6移植Shell脚本:Linux命令输出赋值变量失败
解决Shell命令移植到Python 2.6.6的问题
首先咱们先明确原Shell命令的作用:从file_name文件的每行提取第5个字段,然后移除所有的右括号),最终把处理后的内容赋值给version变量。你尝试的三种方法都有各自的问题,咱们逐个分析,再给出正确的写法:
问题分析
- 第一种方法(subprocess.call):
subprocess.call()返回的是命令的退出状态码(0表示成功,非0失败),不是命令的输出内容。而且当使用shell=True时,参数应该是一个完整的字符串而非列表;另外tr -d后面缺少了要移除的目标字符)。 - 第二种方法(os.system):
os.system()同样只返回退出状态码,不会捕获命令的输出。同时命令字符串里的双引号没有转义,tr -d ")"里的"会被Python提前解析,导致Shell收到的命令不完整。 - 第三种方法(commands.getstatusoutput):这个函数返回的是一个元组
(status, output),不是直接的输出内容。同样存在引号转义问题,tr -d ")"中的双引号需要转义成\",否则Python会把它当成字符串结束符。
正确的解决方案
方案1:使用commands模块(Python2.6原生支持)
这个模块专门用来捕获命令输出,修正引号问题后,取返回元组的第二个元素即可:
import commands # 转义双引号,确保Shell能正确识别目标字符 status, version = commands.getstatusoutput("awk '{print $5}' file_name | tr -d \")\"") # 若只关心输出,可直接取元组第二个值 version = commands.getstatusoutput("awk '{print $5}' file_name | tr -d \")\"")[1]
或者改用单引号包裹整个命令,内部单引号转义:
version = commands.getstatusoutput('awk \'{print $5}\' file_name | tr -d ")"')[1]
方案2:使用subprocess模块(更推荐,兼容性更好)
Python2.6已经支持subprocess.check_output(),它会直接返回命令的输出内容(命令执行失败时会抛出异常):
import subprocess # 使用shell=True时,传入完整的命令字符串 version = subprocess.check_output("awk '{print $5}' file_name | tr -d \")\"", shell=True) # 去掉末尾多余的换行符 version = version.strip()
如果不想用shell=True(更安全,避免Shell注入风险),可以拆分管道为两个子进程:
import subprocess # 第一步用awk提取第5个字段 awk_process = subprocess.Popen(['awk', '{print $5}', 'file_name'], stdout=subprocess.PIPE) # 第二步用tr移除右括号,获取最终输出 version = subprocess.check_output(['tr', '-d', ')'], stdin=awk_process.stdout) awk_process.wait() version = version.strip()
方案3:纯Python实现(无需调用外部命令)
其实完全可以不用依赖awk和tr,直接用Python处理文件,更高效也更跨平台:
# 处理单行结果的情况(假设文件只有一行有效内容) with open('file_name', 'r') as f: line = f.readline().strip() fields = line.split() if len(fields) >= 5: version = fields[4].replace(')', '').strip() # 处理多行结果的情况 version_lines = [] with open('file_name', 'r') as f: for line in f: fields = line.strip().split() if len(fields) >=5: processed_part = fields[4].replace(')', '') version_lines.append(processed_part) version = '\n'.join(version_lines)
内容的提问来源于stack exchange,提问作者Raj
相关产品推荐
相关产品推荐

