Python子进程输出到列表或文件
我想在Python 3中运行以下的bash命令:
ls -l
我知道我可以这样做:
from subprocess import call
call(['ls', '-l'])
我该如何把这个输出保存到一个文件里,或者放到列表或集合中呢?
[-rw-r--r--] [1] [name] [staff] [426] [14 Jan 21:52] [HelloWorld.class]
[-rw-r--r--@] [1] [name] [staff] [107] [14 Jan 21:51] [HelloWorld.java]
...
etc.
我希望能够直接访问特定的信息,然后把它添加到集合里,但我不知道会列出多少个项目。
任何提示、代码片段或例子都会很有帮助。
6 个回答
7
如果你真正想要的是列出一个文件夹里的内容,那就用 os.listdir 这个方法吧。
import os
files = os.listdir('/path/to/dir')
for file in files:
print(file)
29
在Python 3.5及以上版本中,你可以使用 subprocess.run 这个功能:
ls_lines = subprocess.run(['ls', '-l'], stdout=subprocess.PIPE).stdout.splitlines()
在Python 2.7及以上版本或者Python 3.0及以上版本中,你可以使用 subprocess.check_output 这个功能:
ls_lines = subprocess.check_output(['ls', '-l']).splitlines()
在Python 2.7之前,你需要使用更底层的接口,这个会稍微复杂一些。
ls_proc = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE)
ls_proc.wait()
# check return code
ls_lines = ls_proc.stdout.readlines()
14
获取ls -l
命令输出的信息的一种方法是解析它。比如,可以使用csv.DictReader
来将每一列映射到字典中的一个字段:
import subprocess
import csv
process = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE)
stdout, stderr = process.communicate()
reader = csv.DictReader(stdout.decode('ascii').splitlines(),
delimiter=' ', skipinitialspace=True,
fieldnames=['permissions', 'links',
'owner', 'group', 'size',
'date', 'time', 'name'])
for row in reader:
print(row)
上面的代码会为ls -l
输出的每一行打印一个字典,像这样:
{'group': '<group_name>',
'name': '<filename>',
'links': '1',
'date': '<modified_date>',
'time': '<modified_time>',
'owner': '<user_name>',
'permissions': '-rw-rw-r--',
'size': '<size>'}