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)]


--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to