python报错result = subprocess.check_output(command)
时间: 2023-05-21 16:05:50 浏览: 210
这个错误常常是因为代码中的 command 不符合要求,或者 subprocess 模块在执行 command 时发生了错误。您可以先检查代码中的 command 是否正确,然后检查当前环境中是否存在 subprocess 模块。如果这些都没有问题,你还可以尝试在代码中添加 try 和 except 语句来捕捉这个错误,并尝试解决它。
相关问题
Traceback (most recent call last): File "/root/test/2.py", line 226, in <module> print(run_command(bbbb)) File "/root/test/2.py", line 72, in run_command result = subprocess.run(command, sshell=True, check=True, capture_output=True, text=True) File "/usr/local/python3/lib/python3.7/subprocess.py", line 453, in run with Popen(*popenargs, **kwargs) as process: TypeError: init() got an unexpected keyword argument 'sshell'
根据您提供的错误信息,看起来是因为在调用`subprocess.run()`函数时传递了一个错误的参数`sshell`。实际上,正确的参数应该是`shell`,而不是`sshell`。
请将代码中的`sshell=True`修改为`shell=True`,然后再次运行您的程序。
修改后的代码示例:
```python
result = subprocess.run(command, shell=True, check=True, capture_output=True, text=True)
```
这样修改后,应该可以解决该错误并正常运行您的程序。如果还有其他问题,请提供更多的错误信息或相关代码,以便我可以更好地帮助您。
# -*- coding: utf-8 -*- import re import subprocess # 运行命令并获取输出 command = 'ls -rtd /home/cxcc/log/debug/* | tail -n 1 | xargs cat | grep "phoneModel"' output = subprocess.check_output(command, shell=True, universal_newlines=True) # 提取所有匹配项 pattern = r"设备品牌:(.+?) - 设备型号:(.+?) - 系统版本:(.+?) - APP版本:(.+?) - 录音位置:(.+?)\," matches = re.findall(pattern, output) # 提取所有agent属性 agent_pattern = r"agent=(\d+)" agent_matches = re.findall(agent_pattern, output) # 将匹配项和agent属性合并为一个列表 data = [(matches[i], agent_matches[i]) for i in range(len(matches))] # 将列表转换为set以删除重复项 unique_data = list(set(data)) # 对结果进行排序 unique_data.sort() # 将结果输出到txt文件中 with open("output.txt", "w") as f: for match, agent in unique_data: f.write("设备品牌:" + match[0] + "\n") f.write("设备型号:" + match[1] + "\n") f.write("系统版本:" + match[2] + "\n") f.write("APP版本:" + match[3] + "\n") f.write("录音位置:" + match[4] + "\n") f.write("agent:" + agent + "\n") f.write("\n") 这段代码有什么优化建议
这段代码的优化建议如下:
1. 使用subprocess.run代替subprocess.check_output,这样可以更好地处理错误情况。
2. 使用with语句管理文件句柄,可以自动关闭文件,不需要手动调用close()方法。
3. 将匹配和输出分离成两个函数,使代码更易读。
4. 使用re.finditer代替re.findall,可以避免在内存中创建一个完整的列表,而是每次迭代只产生一个匹配项。
5. 将re.compile放在函数外部,这样可以避免在每次调用函数时都重新编译正则表达式。
6. 添加一些注释,使代码更易于理解。
下面是优化后的代码示例:
```python
import re
import subprocess
# 编译正则表达式,以便在多次调用函数时重用
MATCH_PATTERN = re.compile(r"设备品牌:(.+?) - 设备型号:(.+?) - 系统版本:(.+?) - APP版本:(.+?) - 录音位置:(.+?)\,")
AGENT_PATTERN = re.compile(r"agent=(\d+)")
def get_output(command):
"""运行命令并返回输出结果。"""
try:
result = subprocess.run(command, shell=True, check=True, stdout=subprocess.PIPE, universal_newlines=True)
return result.stdout
except subprocess.CalledProcessError as e:
print(f"Error running command: {e}")
return ""
def extract_data(output):
"""从输出中提取匹配项和agent属性,返回一个包含它们的元组列表。"""
matches = MATCH_PATTERN.finditer(output)
agent_matches = AGENT_PATTERN.findall(output)
data = [(match.groups(), agent) for match, agent in zip(matches, agent_matches)]
return data
def write_output(data, filename):
"""将数据写入到指定的文件中。"""
with open(filename, "w") as f:
for match, agent in data:
f.write("设备品牌:" + match[0] + "\n")
f.write("设备型号:" + match[1] + "\n")
f.write("系统版本:" + match[2] + "\n")
f.write("APP版本:" + match[3] + "\n")
f.write("录音位置:" + match[4] + "\n")
f.write("agent:" + agent + "\n")
f.write("\n")
if __name__ == "__main__":
command = 'ls -rtd /home/cxcc/log/debug/* | tail -n 1 | xargs cat | grep "phoneModel"'
output = get_output(command)
data = extract_data(output)
# 将结果按照设备品牌进行排序
data.sort(key=lambda x: x[0][0])
write_output(data, "output.txt")
```
阅读全文