Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.python > #5934

Re: Problem in using subprocess module and communicate()

References <BANLkTiktJHy2yrkdaGD3o-CCJ2i4CgtBsA@mail.gmail.com>
Date 2011-05-21 12:38 -0700
Subject Re: Problem in using subprocess module and communicate()
From Chris Rebert <clp2@rebertia.com>
Newsgroups comp.lang.python
Message-ID <mailman.1887.1306006743.9059.python-list@python.org> (permalink)

Show all headers | View raw


On Sat, May 21, 2011 at 8:56 AM, vijay swaminathan <swavijay@gmail.com> wrote:
> Hi  Gurus,
>
> I'm having some problem in using the communicate() along with the
> subprocess.I would like to invoke a command prompt and pass  on a .bat file
> to execute. I went through the subprocess module and understood that using
> communicate, we can send the send data to stdin.
>
> According to the documentation
> http://docs.python.org/library/subprocess.html#subprocess.call, it says,
>
> if you want to send data to the process’s stdin, you need to create the
> Popen object with stdin=PIPE.
>
> so based on this, I have used the below function but it does not seem to
> work. Am I missing something here?
>
> import subprocess
> import threading
> import time
>
> def runMonitor(command):
>     retcode = subprocess.Popen([command, '\k', 'dir'],

Shouldn't that be /k, not \k?

>                                cwd=
> 'C:\Python26\WorkSpace\FunctionExamples\src',

Sidenote: You really should use forward-slashes in paths like this (or
double-up the backslashes).

>                                stdin = subprocess.PIPE,
>                                creationflags=subprocess.CREATE_NEW_CONSOLE)
>
>     retcode.wait()
>
>     retcode.communicate('scripts_to_execute.bat')

Several issues here:
- .wait() waits for the subprocess to terminate; there's reason for
the shell to terminate here, so your program will hang forever on the
.wait() call.
- It makes no sense to call .communicate() after .wait(), since the
subprocess will have already terminated; you can't communicate with a
dead process.
- .communicate() blocks until the subprocess terminates anyway, so
calling .wait() is pointless.
- I would think a newline is needed in you input to the shell. When
one runs a command in the shell manually, one presses Enter after
typing it, no?
- `retcode` seems a rather poor variable name, since it's holding a
Popen object rather than an integer exit code.

Putting this all together, here's an improved version:

def runMonitor(command):
    proc = subprocess.Popen([command, '/k', 'dir'],
        cwd='C:/Python26/WorkSpace/FunctionExamples/src',
        stdin=subprocess.PIPE,
        creationflags=subprocess.CREATE_NEW_CONSOLE)
    input_data = 'scripts_to_execute.bat\n' + 'exit\n'
    stdout_data, stderr_data = proc.communicate(input_data)

I can't test it since I don't run Windows.

Cheers,
Chris
--
http://rebertia.com

Back to comp.lang.python | Previous | Next | Find similar | Unroll thread


Thread

Re: Problem in using subprocess module and communicate() Chris Rebert <clp2@rebertia.com> - 2011-05-21 12:38 -0700

csiph-web