473,287 Members | 1,463 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,287 software developers and data experts.

how to get the stdout of the script that os.system executes

5
i know that in python, os.system(cmd) can be used to execute a script or command, and the return value is 0 if successful, rather than the standard output of the script that it executes.

e.g.

>>> a=os.system("echo hello")
>>> a
0 (rather than "hello")

my question is how to direct the standard output into a variable in my python script.
Oct 31 '07 #1
11 45079
The only way I've been able to get output from os.system is to use ">" in the command to make the subshell write its output to a file. Then all I have to do is read the file.
Expand|Select|Wrap|Line Numbers
  1. >>> os.system("echo hello > output.txt")
  2.  
  3. >>> reader = open("output.txt")
  4. >>> print reader.read()
  5. hello 
If you want to just append to the file instead of truncating then appending, use ">>" instead of ">".

It would be nice if there was a more direct method, so hopefully someone else knows one. I'd be very interested to know what it is.
Oct 31 '07 #2
Smygis
126 100+
It would be nice if there was a more direct method, so hopefully someone else knows one. I'd be very interested to know what it is.
Tere is the commands module.

[code=python]
>>> import commands
>>> print commands.getoutput("echo helllo")
helllo
>>> import commands
>>> print commands.getoutput("echo hello")
hello
>>> txt = commands.getoutput("uname -a")
>>> print txt
Linux Bob 2.6.20-15-server #2 SMP Sun Apr 15 07:41:34 UTC 2007 i686 GNU/Linux
[code]

I also think os.popen works. but i have no experience with that. commands is quick and easy. i think os.popen is more advanced
Oct 31 '07 #3
bartonc
6,596 Expert 4TB
i know that in python, os.system(cmd) can be used to execute a script or command, and the return value is 0 if successful, rather than the standard output of the script that it executes.

e.g.

>>> a=os.system("echo hello")
>>> a
0 (rather than "hello")

my question is how to direct the standard output into a variable in my python script.
Since you have not stated your OS, our freind Smygis has given a great solution (if you are running under *nix). I'd recommend, however, that you use the newer subprocess module.
6.8 subprocess -- Subprocess management

New in version 2.4.

The subprocess module allows you to spawn new processes, connect to their input/output/error pipes, and obtain their return codes. This module intends to replace several other, older modules and functions, such as:


os.system
os.spawn*
os.popen*
popen2.*
commands.*
Oct 31 '07 #4
bartonc
6,596 Expert 4TB
Since you have not stated your OS, our freind Smygis has given a great solution (if you are running under *nix). I'd recommend, however, that you use the newer subprocess module.
Try:
Expand|Select|Wrap|Line Numbers
  1. import subprocess as sub
  2. retcode = sub.call(["ls", "-l"])
And let us know how that works out for you.
Oct 31 '07 #5
bartonc
6,596 Expert 4TB
Try:
Expand|Select|Wrap|Line Numbers
  1. import subprocess as sub
  2. retcode = sub.call(["ls", "-l"])
And let us know how that works out for you.
On Windows, this:
Expand|Select|Wrap|Line Numbers
  1. >>> import subprocess as sub
  2. >>> sub.call(['dir'], shell=True)
worked in a Python command-line shell, but not in my IDE (Boa Constructor).
Oct 31 '07 #6
Smygis
126 100+
Try:
Expand|Select|Wrap|Line Numbers
  1. import subprocess as sub
  2. retcode = sub.call(["ls", "-l"])
And let us know how that works out for you.
Still, that prints the result. And does not return it.

So no, Ill stick with commands.

Whenever i need something like this. And thats only happend like two times.
Oct 31 '07 #7
wxy212
5
Thanks for all of your replies.

"var = commands.getoutput(cmd)" seems to be good. However, it doesn't check if the command has been executed successfully.

What i want is if it's executed successfully, then write the stdout to a variable, otherwise die with an error message..

If i use "if os.system(cmd) != 0:" to check it before running "var=commands.getoutput(cmd)", then the stdout will not only be written to variable var, but also pop on the prompt screen, which is not what I like..

Does anyone have some idea?
Oct 31 '07 #8
Smygis
126 100+
Thanks for all of your replies.

"var = commands.getoutput(cmd)" seems to be good. However, it doesn't check if the command has been executed successfully.

What i want is if it's executed successfully, then write the stdout to a variable, otherwise die with an error message..

If i use "if os.system(cmd) != 0:" to check it before running "var=commands.getoutput(cmd)", then the stdout will not only be written to variable var, but also pop on the prompt screen, which is not what I like..

Does anyone have some idea?
commands.getstatusoutput

Expand|Select|Wrap|Line Numbers
  1. >>> fail = commands.getstatusoutput("ps -q")
  2. >>> notfail = commands.getstatusoutput("ps -A")
  3. >>> fail[0]
  4. 256
  5. >>> len(fail[1]) # the output
  6. 1517
  7. >>> notfail[0]
  8.  
  9. >>> len(notfail[1]) # the output
  10. 3408
  11.  
  12.  
Oct 31 '07 #9
wxy212
5
commands.getstatusoutput

Expand|Select|Wrap|Line Numbers
  1. >>> fail = commands.getstatusoutput("ps -q")
  2. >>> notfail = commands.getstatusoutput("ps -A")
  3. >>> fail[0]
  4. 256
  5. >>> len(fail[1]) # the output
  6. 1517
  7. >>> notfail[0]
  8.  
  9. >>> len(notfail[1]) # the output
  10. 3408
  11.  
  12.  


brilliant!! thanks a lot..
Oct 31 '07 #10
ghostdog74
511 Expert 256MB
note also that commands modules is Unix specific.( AFAIK , correct me if i am wrong)
i use this sometimes
Expand|Select|Wrap|Line Numbers
  1. import os
  2. fin, fout = os.popen4(cmd)
  3. print fout.read() #standard out
  4.  
Nov 2 '07 #11
Smygis
126 100+
note also that commands modules is Unix specific.( AFAIK , correct me if i am wrong)
i use this sometimes
Expand|Select|Wrap|Line Numbers
  1. import os
  2. fin, fout = os.popen4(cmd)
  3. print fout.read() #standard out
  4.  

commands is a simple unix specific wrapper for os.popen:
The whole content of commands.py:

Expand|Select|Wrap|Line Numbers
  1. smygis@Bob:~$ cat /usr/lib/python2.5/commands.py
  2. """Execute shell commands via os.popen() and return status, output.
  3.  
  4. Interface summary:
  5.  
  6.        import commands
  7.  
  8.        outtext = commands.getoutput(cmd)
  9.        (exitstatus, outtext) = commands.getstatusoutput(cmd)
  10.        outtext = commands.getstatus(file)  # returns output of "ls -ld file"
  11.  
  12. A trailing newline is removed from the output string.
  13.  
  14. Encapsulates the basic operation:
  15.  
  16.       pipe = os.popen('{ ' + cmd + '; } 2>&1', 'r')
  17.       text = pipe.read()
  18.       sts = pipe.close()
  19.  
  20.  [Note:  it would be nice to add functions to interpret the exit status.]
  21. """
  22.  
  23. __all__ = ["getstatusoutput","getoutput","getstatus"]
  24.  
  25. # Module 'commands'
  26. #
  27. # Various tools for executing commands and looking at their output and status.
  28. #
  29. # NB This only works (and is only relevant) for UNIX.
  30.  
  31.  
  32. # Get 'ls -l' status for an object into a string
  33. #
  34. def getstatus(file):
  35.     """Return output of "ls -ld <file>" in a string."""
  36.     return getoutput('ls -ld' + mkarg(file))
  37.  
  38.  
  39. # Get the output from a shell command into a string.
  40. # The exit status is ignored; a trailing newline is stripped.
  41. # Assume the command will work with '{ ... ; } 2>&1' around it..
  42. #
  43. def getoutput(cmd):
  44.     """Return output (stdout or stderr) of executing cmd in a shell."""
  45.     return getstatusoutput(cmd)[1]
  46.  
  47.  
  48. # Ditto but preserving the exit status.
  49. # Returns a pair (sts, output)
  50. #
  51. def getstatusoutput(cmd):
  52.     """Return (status, output) of executing cmd in a shell."""
  53.     import os
  54.     pipe = os.popen('{ ' + cmd + '; } 2>&1', 'r')
  55.     text = pipe.read()
  56.     sts = pipe.close()
  57.     if sts is None: sts = 0
  58.     if text[-1:] == '\n': text = text[:-1]
  59.     return sts, text
  60.  
  61.  
  62. # Make command argument from directory and pathname (prefix space, add quotes).
  63. #
  64. def mk2arg(head, x):
  65.     import os
  66.     return mkarg(os.path.join(head, x))
  67.  
  68.  
  69. # Make a shell command argument from a string.
  70. # Return a string beginning with a space followed by a shell-quoted
  71. # version of the argument.
  72. # Two strategies: enclose in single quotes if it contains none;
  73. # otherwise, enclose in double quotes and prefix quotable characters
  74. # with backslash.
  75. #
  76. def mkarg(x):
  77.     if '\'' not in x:
  78.         return ' \'' + x + '\''
  79.     s = ' "'
  80.     for c in x:
  81.         if c in '\\$"`':
  82.             s = s + '\\'
  83.         s = s + c
  84.     s = s + '"'
  85.     return s
  86.  
Nov 2 '07 #12

Sign in to post your reply or Sign up for a free account.

Similar topics

8
by: Sticks | last post by:
ok... im not quite sure how to describe my problem. i have a php script that runs through my entire php site and writes the resulting output to html files. this is necessary as the nature of the...
1
by: Ben Floyd | last post by:
It goes like this: Im converting a perl script that executes a command on each result of a directory listing. In perl, all is well. In Python, using approximately the same logic creates a...
4
by: Paul Nilsson | last post by:
Hi, Does anyone know how to redirect text output when issuing a system or an execlp call? I have a GUI that insists on opening up a console whenever I give a system function call, and I would...
5
by: alexLIGO | last post by:
Hi, I am trying to run a python script that executes several other programs on the bash (under linux) and reads some of the output of those programs. This works fine for a couple of os.system()...
1
by: Russ | last post by:
I've been trying to get my head around this for 3 days now and it seems like everything I try does not work for one reason or another. I built a test page using the TabStrip and MultiPage controls....
0
by: Elad | last post by:
Hello All, I am trying to capture some printf's from a C function called by python. <Working under winxp> I have tried to following: STDOUT = 1 # stdout fd (re, we) = os.pipe() #...
6
by: tatamata | last post by:
Hello. How can I run some Python script within C# program? Thanks, Zlatko
8
by: grikdog | last post by:
How to I capture stdout output from a system call and pipe it back into my running script? system "echo foobar"; # how to continue here with "foobar" in stdin ?? ... I can fake it with...
1
by: vivek samantray | last post by:
i have a script which executes several queries for n number of records.How can is set the time in that to know how much time each query took to run
2
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 7 Feb 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:30 (7.30PM). In this month's session, the creator of the excellent VBE...
0
by: DolphinDB | last post by:
The formulas of 101 quantitative trading alphas used by WorldQuant were presented in the paper 101 Formulaic Alphas. However, some formulas are complex, leading to challenges in calculation. Take...
0
by: DolphinDB | last post by:
Tired of spending countless mintues downsampling your data? Look no further! In this article, you’ll learn how to efficiently downsample 6.48 billion high-frequency records to 61 million...
0
by: Aftab Ahmad | last post by:
So, I have written a code for a cmd called "Send WhatsApp Message" to open and send WhatsApp messaage. The code is given below. Dim IE As Object Set IE =...
0
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM). In this month's session, we are pleased to welcome back...
1
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM). In this month's session, we are pleased to welcome back...
0
by: Vimpel783 | last post by:
Hello! Guys, I found this code on the Internet, but I need to modify it a little. It works well, the problem is this: Data is sent from only one cell, in this case B5, but it is necessary that data...
0
by: jfyes | last post by:
As a hardware engineer, after seeing that CEIWEI recently released a new tool for Modbus RTU Over TCP/UDP filtering and monitoring, I actively went to its official website to take a look. It turned...
1
by: PapaRatzi | last post by:
Hello, I am teaching myself MS Access forms design and Visual Basic. I've created a table to capture a list of Top 30 singles and forms to capture new entries. The final step is a form (unbound)...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.