python subprocess output to list or file
Question:
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.
Answers:
from subprocess import Popen, PIPE
output = Popen(['ls', '-l'], stdout=PIPE).communicate()[0]
You can then do whatever you want with the output. See python docs for detailed documentation
With >= python3.5 you can use subprocess.run:
ls_lines = subprocess.run(['ls', '-l'], stdout=PIPE).stdout.splitlines()
With >= python2.7 or >= python3.0 you can use subprocess.check_output:
ls_lines = subprocess.check_output(['ls', '-l']).splitlines()
Prior to python2.7, you need to use the lower level api, which is a bit more involved.
ls_proc = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE)
ls_proc.wait()
# check return code
ls_lines = ls_proc.stdout.readlines()
Read about Popen. the set you asked for you get with
import subprocess
proc = subprocess.Popen(['ls','-l'],stdout=subprocess.PIPE,stderr=subprocess.PIPE)
myset=set(proc.stdout)
or do something like
for x in proc.stdout : print x
and the same for stderr
you can examine the state of the process with
proc.poll()
or wait for it to terminate with
proc.wait()
also read
If what you really want is to list a directory, rather use os.listdir
import os
files = os.listdir('/path/to/dir')
for file in files:
print(file)
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>'}
People have already responded to it. Nevertheless, just in case somebody needs it
import subprocess
output_list=subprocess.check_output(['locate','*.nse']).decode('utf-8').split('n')[:-1]
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.
from subprocess import Popen, PIPE
output = Popen(['ls', '-l'], stdout=PIPE).communicate()[0]
You can then do whatever you want with the output. See python docs for detailed documentation
With >= python3.5 you can use subprocess.run:
ls_lines = subprocess.run(['ls', '-l'], stdout=PIPE).stdout.splitlines()
With >= python2.7 or >= python3.0 you can use subprocess.check_output:
ls_lines = subprocess.check_output(['ls', '-l']).splitlines()
Prior to python2.7, you need to use the lower level api, which is a bit more involved.
ls_proc = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE)
ls_proc.wait()
# check return code
ls_lines = ls_proc.stdout.readlines()
Read about Popen. the set you asked for you get with
import subprocess
proc = subprocess.Popen(['ls','-l'],stdout=subprocess.PIPE,stderr=subprocess.PIPE)
myset=set(proc.stdout)
or do something like
for x in proc.stdout : print x
and the same for stderr
you can examine the state of the process with
proc.poll()
or wait for it to terminate with
proc.wait()
also read
If what you really want is to list a directory, rather use os.listdir
import os
files = os.listdir('/path/to/dir')
for file in files:
print(file)
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>'}
People have already responded to it. Nevertheless, just in case somebody needs it
import subprocess
output_list=subprocess.check_output(['locate','*.nse']).decode('utf-8').split('n')[:-1]