Python ';波本';对象不可编辑
我试图通过subprocess命令将一些ID提取到列表中。下面是我的代码:Python ';波本';对象不可编辑,python,linux,list,python-3.x,subprocess,Python,Linux,List,Python 3.x,Subprocess,我试图通过subprocess命令将一些ID提取到列表中。下面是我的代码: list1=[] list2=[] list1 = subprocess.Popen("pgrep -u root",stdout=subprocess.PIPE, shell = True) for i in list1: file1 = open(os.path.join('/proc',i,'status')).readlines() for line in file1: if li
list1=[]
list2=[]
list1 = subprocess.Popen("pgrep -u root",stdout=subprocess.PIPE, shell = True)
for i in list1:
file1 = open(os.path.join('/proc',i,'status')).readlines()
for line in file1:
if line.startswith("Mem: "):
id = int(line.split()[5])
if line.startswith("Cpu: "):
toC = int(line.split()[8])
list2 = (id,toC)
for k in list2:
self.text.insert(INSERT,k[0])
self.text.insert(INSERT,k[1])
我得到的错误是:“Popen”对象不可编辑。
我正在创建一个列表并将ID提取到一个列表中,然后对于列表中的每个ID,我试图获取mem和cpu信息。此信息再次输入另一个空列表(列表2)。我正在迭代列表2以显示这些信息。我哪里出错了?如果您想知道通话结果,您需要与 子进程对象
proc = subprocess.Popen(['pgrep', '-u', 'root'], stdout=subprocess.PIPE)
text = proc.communicate()[0].decode('utf-8')
for i in text.splitlines():
...
Popen
对象不是流程的输出,而是表示正在运行的子流程的对象
如果可以,也要避免使用
shell=True
,因为它被广泛认为是一个安全问题,您在这里不需要它。如果您想要通话结果,您需要使用
子进程对象
proc = subprocess.Popen(['pgrep', '-u', 'root'], stdout=subprocess.PIPE)
text = proc.communicate()[0].decode('utf-8')
for i in text.splitlines():
...
Popen
对象不是流程的输出,而是表示正在运行的子流程的对象
如果可以的话,也要避免使用
shell=True
,因为它被广泛认为是一个安全问题,在这里您不需要它。调用subprocess.Popen
会产生一个错误。它不会给你一个列表,也不会给你一些你可以迭代的东西,因为Popen
对象是不可编辑的
使用同一个库中的更高级别函数以字符串形式获取输出,然后解析该字符串并相应地进行循环更容易。在Python 3.5中,您只需调用:
这将为您提供一个CompletedProcess
对象,您可以从中检查输出
在Python3.4或更早版本中,您可以改为使用。调用
subprocess.Popen
生成一个。它不会给你一个列表,也不会给你一些你可以迭代的东西,因为Popen
对象是不可编辑的
使用同一个库中的更高级别函数以字符串形式获取输出,然后解析该字符串并相应地进行循环更容易。在Python 3.5中,您只需调用:
这将为您提供一个CompletedProcess
对象,您可以从中检查输出
在Python3.4或更早版本中,您可以改为使用。对于此场景(您只阅读stdout
和stdin
/stderr
未被触及),您可能不想使用。通信或运行。在生成行时更容易处理这些行,而这些API没有这样做(它们在返回之前将所有内容缓冲到内存中)
要逐行处理输出,只需更改:
for i in list1:
致:
此外,Python 3上的类型也有问题;要解决此问题(并避免出现shell=True
的问题),请将Popen
行更改为:
list1 = subprocess.Popen(['pgrep', '-u', 'root'], stdout=subprocess.PIPE, universal_newlines=True)
其中universal\u newlines=True
从列表1进行读取。stdout
返回str
,而不是字节
,对于此场景(您仅在读取stdout
和stdin
//code>时,stderr
未被触及),您可能不想要.communication
或.run
。在生成行时更容易处理这些行,而这些API没有这样做(它们在返回之前将所有内容缓冲到内存中)
要逐行处理输出,只需更改:
for i in list1:
致:
此外,Python 3上的类型也有问题;要解决此问题(并避免出现shell=True
的问题),请将Popen
行更改为:
list1 = subprocess.Popen(['pgrep', '-u', 'root'], stdout=subprocess.PIPE, universal_newlines=True)
其中universal\u newlines=True
读取list1.stdout
returnstr
,而不是bytes
,我得到一个错误:TypeError(“无法在路径组件中混合字符串和字节”)。当我尝试按您的方式迭代时。@dee是的,这是一个不同的问题,但我已经更新了该行以解码它为什么说,“没有这样的文件或目录pgrep-u root”。当我尝试打印时,它可以正常工作。你说的“当我尝试打印它时”是什么意思?错误来自哪一行?@RyanHaining:当我使用诸如:print(list2.communicate())之类的打印语句时,它可以正常工作,也就是说它可以打印该用户处理的所有PID(在我的例子中是root)。错误来自第1行(filenotfound error from subprocess.py)。当我尝试以您的方式进行迭代时,我得到了这个错误:TypeError(“不能在路径组件中混合字符串和字节”)。@dee是的,这是一个不同的问题,但我已更新该行以解码为什么它会说,“没有这样的文件或目录pgrep-u root?”当我试着打印时,效果很好。你说的“当我试着打印时”是什么意思?还有,错误来自哪一行?@RyanHaining:当我使用print(list2.communicate())这样的print语句时,它工作正常,即它打印该用户处理的所有PID(在我的例子中是root)。错误来自第1行(filenotfound error from subprocess.py),我正在使用python 3.4,它说:属性错误:模块对象没有属性run。@Deesubprocess.run
在python 3.5中是新的。请参阅编辑。我使用的是python 3.4,它说:属性错误:模块对象没有属性run。@Deesubprocess.run
在python 3.5中是新的。请参阅编辑。获取进程信息的可移植方式是到。获取进程信息的可移植方式是到。注意:如果您单独管道传输两个标准句柄,则如果不使用选择
/选择器
原语或线程,您无法安全地读取/写入其中任何一个;这只是因为您只使用了一个标准句柄,所以完整管道上的死锁不是问题。注意:如果您单独管道传输两个标准句柄,如果不使用select
/选择器
原语或线程,您无法安全地读/写其中任何一个;这只是因为您只使用了一个标准句柄,所以完整管道上的死锁不是问题。