Redirect os.system output

Discussion in 'Python' started by jas, Oct 21, 2005.

  1. jas

    jas Guest

    I would like to redirect the output from os.system to a variable, but
    am having trouble. I tried using os.popen(..).read() ...but that
    doesn't give me exactly what i want.

    ...this is windows by the way.

    For example:
    tmp = os.popen("hostname").read()

    ....works as expected.

    however,

    tmp = os.popen("cmd").read()
    ....i would like to have access to the cmd process...i.e. enter commands
    like a normal command line. os.system() allows this, but i dont want
    output to the screen..i wanna store it to a variable. then send
    content of variable elsewhere, receive more input and submit it.
    almost emulate the windows command prompt.

    any ideas?
     
    jas, Oct 21, 2005
    #1
    1. Advertisements

  2. jas

    Kent Johnson Guest

    Kent Johnson, Oct 21, 2005
    #2
    1. Advertisements

  3. maybe you should look at subprocess module

    I have one expamle, this is Linux though
    226

    hth, Daniel
     
    =?ISO-8859-1?Q?Daniel_Sch=FCle?=, Oct 22, 2005
    #3
  4. jas

    jas Guest

    Any other ideas? or examples of using subprocess to do what I was
    asking?
     
    jas, Oct 24, 2005
    #4
  5. jas

    Kent Johnson Guest

    Actually I thought I was giving an example of what you were asking:
    - on windows
    - send a series of commands to a command process
    - capture the result to a variable

    The example I referenced sends a series of HELP commands to cmd.exe, captures the output of the commands and saves it to a file.

    What did I miss?

    Kent
     
    Kent Johnson, Oct 24, 2005
    #5
  6. jas

    jas Guest

    I see that, although I don't totall grasp the code. However, I am
    looking to basically emulate a command prompt. i.e. everything u see
    in the windows command prompt should be displayed back in python.

    How can I do it without files?
     
    jas, Oct 24, 2005
    #6
  7. jas

    jas Guest

    Ok, I tried this...

    C:\>python
    Python 2.4.1 (#65, Mar 30 2005, 09:13:57) [MSC v.1310 32 bit (Intel)]
    on win32
    Type "help", "copyright", "credits" or "license" for more information.'result' is not recognized as an internal or external command,
    operable program or batch file.

    basically I was opening to send the "ipconfig" command to cmd.exe and
    store the result in the "result" variable. But you can see there was
    an error with result.

    Ideas?
     
    jas, Oct 24, 2005
    #7
  8. jas

    Steve Holden Guest

    It looks to me like the line you thought you were typing at the Python
    command interpreter actually got snagged by the command processor you
    just ran, which presumably is taking its input from the console just
    like Python is.
    Haven't used subprocess much yet, but I will just mention that this kind
    of thing always looks easy in principle and turns out to be surprisingly
    gnarly and difficult in practice.

    I'm not suggesting you shouldn't continue, but you are going to learn a
    *lot* as you proceed. Good luck.

    regards
    Steve
    [...]
     
    Steve Holden, Oct 24, 2005
    #8
  9. jas

    jas Guest

    doesn't sound to encouraging :)

    How about something with os.popen?

    in = os.popen("cmd", "w")
    in.write("hostname")

    I tried this, and I get "IOError: [Errno 22] Invalid Argument"

    I am not sure why this isnt working.

     
    jas, Oct 24, 2005
    #9
  10. jas

    Kent Johnson Guest

    This works for me:
    import subprocess as sp
    p = sp.Popen("ipconfig", stdout=sp.PIPE)
    result = p.communicate()[0]
    print result

    Kent
     
    Kent Johnson, Oct 24, 2005
    #10
  11. jas

    jas Guest

    Kent,
    Yes, your example does work. So did os.popen...however, the problem
    is specific to "cmd.exe".
    Have you tried that yet?

    Thanks!

     
    jas, Oct 24, 2005
    #11
  12. jas

    Paul Dale Guest

    You might want to try python expect which gives you a very simple and
    scriptable interface to a process.

    http://pexpect.sourceforge.net/

    I've been using it on windows to automate a few things.

    Cheers,

    Paul
     
    Paul Dale, Oct 25, 2005
    #12
  13. jas

    jas Guest

    Paul,
    I did ceck out the PExpect, however, I thought it was not ported for
    Windows. Did you find a ported version? If not, what did you have to
    do to be able to use it?

    Thanks

     
    jas, Oct 25, 2005
    #13
  14. jas

    Paul Dale Guest

    pexpect is POSIX compliant and works under Cygwin. I haven't tried it
    under pythonw.

    Just install cgywin (including python) then follow the standard
    instructions for pexpect.

    There was one small trick I had to do to get cygwin working totally
    properly on my machine which was run a rebaseall.

    Rebaseall sets the memory addresses for the DLLs or something like that.

    However, there is a slight problem. The rebaseall runs inside cygwin and
    uses one of the DLLs. To get around this I change the rebaseall script
    to write it's command to a text file and then run those commands in a
    DOS cmd shell. After that everything has worked without problem.


    Good luck,

    Paul
     
    Paul Dale, Oct 25, 2005
    #14
  15. jas

    jas Guest

    Well if I want my code to run on other computers, then they'd have to
    run it under Cygwin right?
     
    jas, Oct 25, 2005
    #15
    1. Advertisements

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments (here). After that, you can post your question and our members will help you out.