Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python ';波本';对象不可编辑_Python_Linux_List_Python 3.x_Subprocess - Fatal编程技术网

Python ';波本';对象不可编辑

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

我试图通过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 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
return
str
,而不是
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。@Dee
subprocess.run
在python 3.5中是新的。请参阅编辑。我使用的是python 3.4,它说:属性错误:模块对象没有属性run。@Dee
subprocess.run
在python 3.5中是新的。请参阅编辑。获取进程信息的可移植方式是到。获取进程信息的可移植方式是到。注意:如果您单独管道传输两个标准句柄,则如果不使用
选择
/
选择器
原语或线程,您无法安全地读取/写入其中任何一个;这只是因为您只使用了一个标准句柄,所以完整管道上的死锁不是问题。注意:如果您单独管道传输两个标准句柄,如果不使用
select
/
选择器
原语或线程,您无法安全地读/写其中任何一个;这只是因为您只使用了一个标准句柄,所以完整管道上的死锁不是问题。