Python subprocess 读取行?

20 投票
5 回答
74695 浏览
提问于 2025-04-17 02:34

我想从使用os.popen转到使用subprocess.popen,这是用户指南推荐的做法。现在我遇到的问题是,我找不到让readlines()正常工作的办法。

之前我可以这样做:

list = os.popen('ls -l').readlines()

但是现在我不能这样做了:

list = subprocess.Popen(['ls','-l']).readlines()

5 个回答

13

在这个链接中,讨论的是如何进行一个系统调用,并且让这个调用的输出结果以字符串的形式返回。简单来说,就是你可以让计算机执行某个命令,然后把这个命令的结果以文本的方式拿到手。这样你就可以在程序中使用这个结果,而不是仅仅在屏幕上显示出来。

lines = subprocess.check_output(['ls', '-l']).splitlines()
39
ls = subprocess.Popen(['ls','-l'], stdout=subprocess.PIPE)
out = ls.stdout.readlines()
for ln in ls.stdout:
    # whatever

或者,如果你想逐行读取(也许另一个进程比 ls 更耗资源):

32

使用 subprocess.Popen 时,可以用 communicate 来读写数据:

out, err = subprocess.Popen(['ls','-l'], stdout=subprocess.PIPE).communicate() 

然后,你可以随时用 splitlines() 来把进程输出的字符串分割成多行。

out = out.splitlines()

撰写回答