Unable to start a process with subprocess Popen()

dudeja.rajat at gmail.com dudeja.rajat at gmail.com
Mon Sep 8 12:35:21 EDT 2008


On Mon, Sep 8, 2008 at 4:43 PM, aha <aquil.abdullah at gmail.com> wrote:
> On Sep 8, 7:23 am, dudeja.ra... at gmail.com wrote:
>> On Mon, Sep 8, 2008 at 11:50 AM,  <dudeja.ra... at gmail.com> wrote:
>> > Hi,
>>
>> > I'm using the subprocess module's Popen() to start a batch file. This
>> > batch file basically calls an exe which also gets started.
>> > Unfortunately, this does not produce any results. I looked into the
>> > Task bar that this exe has started but it does not consume and cpu so
>> > I believet that this exe is not working.
>>
>> > I used the following command to start the batch fiile:
>>
>> > testing = subprocess.Popen([batchFilePath], \
>> >                                   shell = True, \
>> >                                   stdout = subprocess.PIPE, \
>> >                                   stderr =
subprocess.PIPE).communicate()[0]
>>
>> > batchFilePath is the path of the batch file.
>>
>> > --
>> > Regrads,
>> > Rajat
>>
>> Ok, I re-phrase my question:
>>
>> there is a batch file that executes a exe file. The batch just works
>> if run from command prompt and produces output to standard output and
>> the file.
>>
>> Now, I try to call the same batch file from subprocess.Pope() call.
>> The batch file gets called and that internally also calls the exe
>> file.
>>
>> But, the exe just runs forever i.e. hangs and does not produces output
>> , atleast not to the file.
>>
>> Please suggest is there is something wrong with the above code.
>>
>> Regards,
>> Rajat
>
> Hello Rajat,
>  I would take a look at the thread below, it might help it might not:
>
>
http://groups.google.com/group/comp.lang.python/browse_thread/thread/4505613f014fdec7/3ee15c9c88a5efdc?hl=en#3ee15c9c88a5efdc
>
> Also, if you post a larger section of the code I might be able to give
> you a hand. Once you've run the testing = subprocess.Popen()
>
> make sure you use a testing.wait()
> --
> http://mail.python.org/mailman/listinfo/python-list
>
Hi Aaquil,

Thanks for helping me out with this piece of information.
My Original code is :

testing = subprocess.Popen([batchFilePath], \
                                   shell = True, \
                                   stdout = subprocess.PIPE, \
                                   stderr = subprocess.PIPE)

        result = testing.wait()

        if result < 0:
            childError = testing.stderr.read()
            tkMessageBox._show("Error", \
                                   icon='error', \
                                   message ="Error: %s" % childError)
            return None

        else:
            print result
My child process was unresponsive. Later I got to know with the below code
that there were some errors coming from the child process which I was not
able to detect with this code.

I googled for some solution and found the below code :-

print "ttt", batchFilePath
       #print os.listdir(batchFilePath)
       try:
           cmd = subprocess.Popen([batchFilePath], \
                                  shell = True, \
                                  stdin = subprocess.PIPE,
                                  stdout = subprocess.PIPE, \
                                  stderr = subprocess.PIPE \
                                  )
           cmd.stdin.close()
           outPipe, errPipe = PipeThread(cmd.stdout), PipeThread(cmd.stderr)

           outPipe.run(), errPipe.run()
           retcode = cmd.wait()
           out, err = outPipe.getOutput(), errPipe.getOutput()
           if retcode != 0 and err != '':
               raise ExecutionFailed, os.path.basename(batchFilePath) + "
exited with error code " + str(retcode) + " and errors:\n" + err
           elif retcode != 0:
               raise ExecutionFailed, os.path.basename(batchFilePath) + "
exited with error code " + str(retcode) + " and output:\n" + out
           elif err != '':
               return out + "\n" + os.path.basename(batchFilePath) + " gave
warnings:\n" + err
           else:
               return out
       except Exception, e:
           if isinstance(e, ExecutionFailed):
               raise
           else:
               raise ExecutionFailed, "Error while executing " +  ":\n" +
str(e)
       Here are the Exception  and the PipeThread Classes:

class PipeThread(threading.Thread):
    def __init__(self, fin):
        self.fin = fin
        self.sout = ""
        threading.Thread.__init__(self)
    def run(self):
        self.sout = self.fin.read()
    def getOutput(self):
        return self.sout

class ExecutionFailed(Exception):
    def __init__(self, value):
        self.parameter = value
    def __str__(self):
        return str(self.parameter)

Although, this solved my problem. But I know there is no need for using
threading in this problem. This problem could've been solved just by the
subprocess module.

I'm unnecessarily using the threading module.

Regards,
Rajat





-- 
Regrads,
Rajat
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-list/attachments/20080908/4005d849/attachment-0001.html>


More information about the Python-list mailing list