所以我试图按照用户指南的建议从os.popen转移到subprocess.popen。我遇到的唯一麻烦是我似乎找不到让readlines()工作的方法。
所以我以前能够做到
list = os.popen('ls -l').readlines()
但我做不到
list = subprocess.Popen(['ls','-l']).readlines()
答案 0 :(得分:31)
ls = subprocess.Popen(['ls','-l'], stdout=subprocess.PIPE)
out = ls.stdout.readlines()
或者,如果你想逐行阅读(也许其他过程比ls
更密集):
for ln in ls.stdout:
# whatever
答案 1 :(得分:25)
使用subprocess.Popen
,使用communicate
来读取和写入数据:
out, err = subprocess.Popen(['ls','-l'], stdout=subprocess.PIPE).communicate()
然后,您始终可以使用stdout
将流程“splitlines()
”中的字符串拆分。
out = out.splitlines()
答案 2 :(得分:10)
Making a system call that returns the stdout output as a string:
lines = subprocess.check_output(['ls', '-l']).splitlines()
答案 3 :(得分:3)
list = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE).communicate()[0].splitlines()
直接来自help(subprocess)
答案 4 :(得分:3)
使用子进程的更详细方法。
# Set the command
command = "ls -l"
# Setup the module object
proc = subprocess.Popen(command,
shell=True,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
# Communicate the command
stdout_value,stderr_value = proc.communicate()
# Once you have a valid response, split the return output
if stdout_value:
stdout_value = stdout_value.split()