Search code examples
pythonpython-3.xsubprocess

python subprocess output to list or file


I want to run the following bash command in Python 3:

ls -l

I know that I can do the following:

from subprocess import call
call(['ls', '-l'])

How do I save this output to a file, or put it into lists or sets?

[-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.

I want to be able to access particular information directly, and then add it to the set, but I do not know how many items will be listed.

Any hints, snippets, or examples would really help.


Solution

  • One way to access to the information in ls -l output is to parse it. For example, csv.DictReader could be use to map each column to a field in a dictionary:

    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)
    

    The code above will print a dictionary for each line in ls -l output such as:

    {'group': '<group_name>',
     'name': '<filename>',
     'links': '1',
     'date': '<modified_date>',
     'time': '<modified_time>',
     'owner': '<user_name>',
     'permissions': '-rw-rw-r--',
     'size': '<size>'}