Issue with subprocess Module

Dave Angel davea at ieee.org
Tue Apr 7 16:18:11 CEST 2009


Tim Golden wrote:
> <div class="moz-text-flowed" style="font-family: -moz-fixed">Dave 
> Angel wrote:
>> tarun wrote:
>>> Hello All,
>>>
>>> I've a batch file to be  invoke using a python script. The batch 
>>> file has
>>> pause, and the time, I need to send some command to the batch file 
>>> from my
>>> scripts. I placed both, the batch file (test.bat) and the python script
>>> (test.py) in the same folder. And executed 'test.py'
>>>
>>> (Please find the source files and error below).
>>>
>>> *I get the following error:*
>>> Traceback (most recent call last):
>>>   File "<string>", line 74, in run_nodebug
>>>   File "D:\test.py", line 4, in <module>
>>>     proc = subprocess.Popen(my_bat,stdin=subprocess.PIPE)
>>>   File "C:\Python25\lib\subprocess.py", line 588, in __init__
>>>     errread, errwrite) = self._get_handles(stdin, stdout, stderr)
>>>   File "C:\Python25\lib\subprocess.py", line 717, in _get_handles
>>>     c2pwrite = self._make_inheritable(c2pwrite)
>>>   File "C:\Python25\lib\subprocess.py", line 746, in _make_inheritable
>>>     DUPLICATE_SAME_ACCESS)
>>> WindowsError: [Error 6] The handle is invalid
>>>
>>> *Python Script:*
>>> *test.py*
>>> import subprocess,os
>>> my_bat = os.getcwd()+'\\test.bat'
>>> proc = subprocess.Popen(my_bat,stdin=subprocess.PIPE)
>>> input = '\n'
>>> proc.communicate(input)
>>>
>>> *Batch File*
>>> *test.bat*
>>> echo "START'
>>> pause
>>> echo 'END'
>>> Please help me with this issue.
>>>
>>> Thanks In Advance,
>>> Tarun
>>>
>>>   
>> subprocess.Popen() is expecting the name of a program, which should 
>> normally have an extension of .exe   You're handing it a .bat file, 
>> which is not executable.  It only executes in the context of a 
>> command interpreter (shell), such as cmd.exe
>>
>> You can probably do what you want by running "cmd.exe" and passing it 
>> "test.bat" as a parameter
>
> Sounds reasonable, but isn't actually true. This works fine:
>
> <code>
> import subprocess
>
> open ("t.bat", "w").write ("echo hello")
> subprocess.Popen ("t.bat")
>
> </code>
>
> TJG
>
> </div>
>

The docs of Popen() state that it uses CreateProcess() on Windows, so I 
didn't even try it.  Thanks for informing me it works.  I see now the 
COMSPEC manipulation in _execute_child(), but I'm still puzzled.  When I 
step through, it skips that part because we didn't specify shell= as an 
argument.   It still had not put the cmd.exe /c into the args variable 
when it called CreateProcess().  So is the Python CreateProcess more 
than a thin wrapper around Windows version?

Another bug in this program is that it does not include quotes around 
the program name.  If the current directory has a space in it, and an 
appropriately named executable happens to be in the parent directory of 
the one with the space, it'll get run instead of the batch.  For 
example, if the current directory  is   c:\source code\test    and 
there's a file in the route called    c:\source.exe     then it'll get run.

But what about the OP problem?  I now see it runs okay for me, both 
stand-alone and inside Komodo.  But he's getting an exception inside 
make_inheritable(), which is apparently being passed an invalid handle.

Runs OK for me, in Python 2.6 running under XP, SP3.      2.6.1 
(r261:67517, Dec  4 2008, 16:51:00) [MSC v.1500 32 bit (Intel)]





More information about the Python-list mailing list