Python command execution output [duplicate] - python

This question already has answers here:
Closed 11 years ago.
Possible Duplicate:
Running shell command from python and capturing the output
I want to capture the output of a command into a variable, so later that variable can be used again. I need to change this script so it does that:
#!/usr/bin/python
import os
command = raw_input("Enter command: ")
os.system(command)
If I enter "ls" when I run this script, I get this output:
Documents Downloads Music Pictures Public Templates Videos
I want to capture that string (the output of the ls command) into a variable so I can use it again later. How do I do this?

import subprocess
command = raw_input("Enter command: ")
p = subprocess.Popen(command, stdout=subprocess.PIPE)
output, error = p.communicate()

The output of the command can be captured with the subprocess module, specifically, the check_output function..
output = subprocess.check_output("ls")
See also the documentation for subprocess.Popen for the argument list that check_output takes.

This is the way I've done it in the past.
>>> import popen2
__main__:1: DeprecationWarning: The popen2 module is deprecated. Use the subprocess module.
>>> exec_cmd = popen2.popen4("echo shell test")
>>> output = exec_cmd[0].read()
>>> output
'shell test\n'

Related

Not get expected result os.system [duplicate]

This question already has answers here:
Running shell command and capturing the output
(21 answers)
Closed 4 years ago.
The expected result in result variable is root.
version: Python 3.6.7 (default, Oct 22 2018, 11:32:17)
>>> import os
>>> os.system("stat -c '%U' /tmp/test")
root
0
>>> result = os.system("stat -c '%U' /tmp/test")
root
>>> print(result)
0
From the docs of os.system:
On Unix, the return value is the exit status of the process encoded in the format specified for wait()
Your command executes without error, so its exit status is 0, which is what system returns. If you want to get the output of the command you run, you'll need to call the command via one of the subprocess module's functions.
as per description at this link the os.system() returns the exit code of the command and not the actual output. Instead of this you can use subprocess module.
os.system is used to just get the return code, in your case try to use subprocess.check_output
from subprocess import check_output
result = check_output(["stat","-c","'%U'","/tmp/test"])
print result
root

How to use STDIN from subprocess.Popen [duplicate]

This question already has answers here:
How do I pass a string into subprocess.Popen (using the stdin argument)?
(12 answers)
Closed 6 years ago.
How can I implement something like
$ echo "hello" | my_app
with usage of Python's subprocess?
subprocess.Popen() expects a pipe or a file handle for STDIN. But I want to provide STDIN for the called program via a variable. So something like
myinput = "hello"
subprocess.Popen("an_external_programm", stdin=myinput)
….
I was able to solve my problem by using Popen.communicate()
So some kind of pseudo code:
proc = subprocess.Popen(…)
proc.communicate(input="my_input_via_stdin")
In a python script named myscript.py
import sys
for line in sys.stdin:
print(line)
in unix
echo 'hello' | myscript.py

Failed to run shell commands with subprocess [duplicate]

This question already has answers here:
Why subprocess.Popen doesn't work when args is sequence?
(3 answers)
Closed 6 years ago.
In my terminal if I run: echo $(pwd), I got /home/abr/workspace, but when I tried to run this script in python like this:
>>> import subprocess
>>> cmd = ['echo', '$(pwd)']
>>> subprocess.check_output(cmd, shell=True)
I get '\n'. How to fix this?
Use os package:
import os
print os.environ.get('PWD', '')
From the documentation on the subprocess module:
If args is a sequence, the first item specifies the command string,
and any additional items will be treated as additional arguments to
the shell itself.
You want:
subprocess.check_output("echo $(pwd)", shell=True)
Try this:
cmd = 'echo $(pwd)'
subprocess.check_output(cmd, shell=True)
In subprocess doc it specified that cmd should be a string when shell=True.
From the documentation:
The shell argument (which defaults to False) specifies whether to use
the shell as the program to execute. If shell is True, it is
recommended to pass args as a string rather than as a sequence.
A better way to achieve this is probably to use the os module from the python standard library, like this:
import os
print os.getcwd()
>> "/home/abr/workspace"
The getcwd() function returns a string representing the current working directory.
The command subpreocess.check_output will return the output of the command you are calling:
Example:
#echo 2
2
from python
>>>subprocess.check_output(['echo', '2'], shell=True)
>>>'2\n'
the '\n' is included because that is what the command does it prints the output sting and then puts the current on a new line.
now back to your problem; assuming you want the output of 'PWD', first of all you have to get rid of the shell. If you provide the shell argument, the command will be run in a shell environment and you won't see the returned string.
subprocess.check_output(['pwd'])
Will return the current directory + '\n'
On a personal note, I have a hard time understanding what you are trying to do, but I hope this helps solve it.

Execute shell command and retrieve stdout in Python [duplicate]

This question already has answers here:
How do I execute a program or call a system command?
(65 answers)
Convert POSIX->WIN path, in Cygwin Python, w/o calling cygpath
(4 answers)
Closed 7 years ago.
In Perl, if I want to execute a shell command such as foo, I'll do this:
#!/usr/bin/perl
$stdout = `foo`
In Python I found this very complex solution:
#!/usr/bin/python
import subprocess
p = subprocess.Popen('foo', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
stdout = p.stdout.readlines()
retval = p.wait()
Is there any better solution ?
Notice that I don't want to use call or os.system. I would like to place stdout on a variable
An easy way is to use sh package.
some examples:
import sh
print(sh.ls("/"))
# same thing as above
from sh import ls
print(ls("/"))
Read more of the subprocess docs. It has a lot of simplifying helper functions:
output = subprocess.check_output('foo', shell=True, stderr=subprocess.STDOUT)
You can try this
import os
print os.popen('ipconfig').read()
#'ipconfig' is an example of command

Get output of Python command using Popen [duplicate]

This question already has answers here:
Shell command fails from python, ok from shell
(2 answers)
Closed 9 years ago.
I'm trying to execute a shell command from within Python (2.6.4) to evaluate a simple formula before passing it as an argument to another program. My input is something simple like this:
$[2*2]
I want to evaluate that expression and get the result from within my Python script so I can use it later. Currently, I'm doing this (where token is $[2*2]):
token = subprocess.Popen(["echo", token], stdout=subprocess.PIPE).communicate()[0].strip()
I expect the output to be 4, but instead it's just giving me back my original token ($[2*2]). Obviously when I jump to the shell and run this command by hand (echo $[2*2]), I get 4 as expected.
Is there something special about how Python executes this command that I'm missing?
When you run echo $[2*2] in your shell, the shell evaluates $[2*2] and passes the results of that evaluation to the echo command. In your Python code, you are passing the $[2*2] to echo directly and hence, it is returning just that.
You can invoke a shell to evaluate your command using shell=True in subprocess.Popen:
token = subprocess.Popen(["echo " + token],
stdout=subprocess.PIPE, shell=True).communicate()[0].strip()
subprocess.Popen will automatically escape any arguments passed in so that the command is run with those literal strings, or in other words the command that is run is equivalent to echo '$[2*2]'. There are two ways to get around this:
Use shell=True:
>>> import subprocess
>>> token = '$[2*2]'
>>> subprocess.Popen("echo " + token, stdout=subprocess.PIPE, shell=True).communicate()[0].strip()
'4'
Run bash or another shell as your command:
>>> subprocess.Popen(["bash", "-c", "echo " + token], stdout=subprocess.PIPE).communicate()[0].strip()
'4'

Categories