I need to read a shell command output from python script and fill a list with each line:
ISSUE: If I save the command output as a variable, the loop cycle read it character-by-character
#!/usr/bin/python
import subprocess
CMD = "ls -la"
output = subprocess.check_output(CMD, shell=True)
list = []
for line in output:
list.append(line)
print list
Bad output: ['t', 'o', 't', 'a', 'l', ' ', '5',...]
WORKAROUND: As a work around, I directed the comand output to a file, and from there read line-by-line:
#!/usr/bin/python
import subprocess
CMD = "ls -la > tmp"
subprocess.call(CMD, shell=True)
list = []
f = open("tmp", "r")
for line in f:
list.append(line)
print list
Good output ['total 52\n', 'drwxrwxr-x 3 ajn ajn 4096 mars 11 17:52 .\n',...]
QUESTION: How can I use the 1st approach (no file manipulation ,all inside the program) with the result of the second approach?
I'm not really a python guy, but this should work for you and seems a bit clearer:
import subprocess
cmd = ["ls", "-la"]
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE)
for line in proc.stdout.readlines():
print line
Don't use proc.stdout.readlines()
. This reads all OUTPUT before it returns. You need to use proc.stdout
.
Here is yy.py
:
import subprocess
cmd = ["bash", "./yy.sh"]
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE)
for line in proc.stdout:
print( line )
Here is yy.sh
:
for a in 1 2 3 4 5 6 7 8 9 0; do
echo "hi $a !!!"
sleep 1
done
When you run yy.py
you get output line by line.
If you use proc.stdout.readlines()
, you wait 10 seconds and get all output.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With