python子进程输出到列表或文件

tp5buhyn  于 2023-01-14  发布在  Python
关注(0)|答案(6)|浏览(152)

我想在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.

我希望能够直接访问特定的信息,然后将其添加到集合中,但我不知道将列出多少项。
任何提示、片段或示例都会很有帮助。

nkcskrwz

nkcskrwz1#

对于〉= python3.5,您可以使用subprocess.run:

ls_lines = subprocess.run(['ls', '-l'], stdout=PIPE).stdout.splitlines()

对于〉= python2.7或〉= python3.0,您可以使用subprocess.check_output:

ls_lines = subprocess.check_output(['ls', '-l']).splitlines()

在python2.7之前,你需要使用较低级别的API,这有点复杂。

ls_proc = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE)
ls_proc.wait()
# check return code
ls_lines = ls_proc.stdout.readlines()
n1bvdmb6

n1bvdmb62#

访问ls -l输出中的信息的一种方法是解析它。例如,csv.DictReader可用于将每列Map到字典中的字段:

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>'}
uemypmqf

uemypmqf3#

如果您真正想要的是列出一个目录,则使用os.listdir

import os
files = os.listdir('/path/to/dir')
for file in files:
    print(file)
s4chpxco

s4chpxco4#

阅读关于Popen的文章。你要的那一套你得到了

import subprocess
proc = subprocess.Popen(['ls','-l'],stdout=subprocess.PIPE,stderr=subprocess.PIPE)
myset=set(proc.stdout)

或者做一些

for x in proc.stdout : print x

stderr也是如此
可以使用检查进程的状态

proc.poll()

或等待它终止

proc.wait()

另读
read subprocess stdout line by line

n3ipq98p

n3ipq98p5#

from subprocess import Popen, PIPE
output = Popen(['ls', '-l'], stdout=PIPE).communicate()[0]

然后你就可以对输出做任何你想做的事情了。

jobtbby3

jobtbby36#

人们已经对它作出了React。不过,万一有人需要它

import subprocess
output_list=subprocess.check_output(['locate','*.nse']).decode('utf-8').split('\n')[:-1]

相关问题