70

I try to run a .bat file in Windows using Python script.

ask.bat file:

Application.exe work.xml

I write Python code :

import os
os.system("D:\xxx1\xxx2XMLnew\otr.bat ")

Output: when try to run the file its just give a blink of the command prompt, and the work is not performing.

Note: I try with alternate slash also , but it is not working.

And I also want to save output of the file in another file.

Can anyone suggest how can I make the script runnable.

Martin Prikryl
  • 188,800
  • 56
  • 490
  • 992
Silver
  • 717
  • 1
  • 5
  • 3

10 Answers10

53

This has already been answered in detail on SO. Check out this thread, It should answer all your questions: Executing a subprocess fails

I've tried it myself with this code:

batchtest.py

from subprocess import Popen
p = Popen("batch.bat", cwd=r"C:\Path\to\batchfolder")
stdout, stderr = p.communicate()

batch.bat

echo Hello World!
pause

I've got the batchtest.py example from the aforementioned thread.

Community
  • 1
  • 1
das_weezul
  • 6,082
  • 2
  • 28
  • 33
  • Hi das_weezul, Thanks for the info., i try what is mentioned there but for me the same problem persists, on executing,a blink of the app. is coming then went out, no work perform – Silver Mar 29 '11 at 08:32
  • while running this code i came around an error:" Windows Error 2: The system cannot find the file specified", but the file path is correct 100% i switch the folder location to test what u said.... code is from subprocess import Popen p = Popen("test.bat", cwd=r"C:\XMLnew") stdout, stderr = p.communicate() – Silver Mar 29 '11 at 09:26
  • 4
    @Silver: `Popen()` can't find the `test.bat` file. In the [docs](http://docs.python.org/library/subprocess.html?highlight=popen#subprocess.Popen) it says "If *cwd* is not `None`, the child’s current directory will be changed to *cwd* before it is executed. Note that this directory is not considered when searching the executable, so you **can’t** specify the program’s path relative to *cwd*." – martineau Mar 29 '11 at 12:00
  • 1
    @martineau He used the path "C:\XMLnew" which is absolute, so that shouldn't be the problem – das_weezul Mar 29 '11 at 12:08
  • 1
    @das_weezul: Yes, but the `"test.bat"` is relative. – martineau Mar 29 '11 at 12:22
  • Can you not just call the content of the batch file from subprocess.Popen, it seems like a unessisary step – Jakob Bowyer Mar 29 '11 at 14:36
  • How would you go about passing an argument to the batch file in this format? – Tyler Shellberg Nov 26 '21 at 04:21
  • Agreed it's a bit of an annoyance setting the absolute `cwd` AND the path to the bat file. I suggest storing the path in a variable then re-using that variable within the code. `from subprocess import Popen dir = fr'C:\path\bat_file_folder' p = Popen(fr"{dir}\test_bat.bat", cwd=dir) stdout, stderr = p.communicate()` – Theo F Jun 06 '23 at 15:29
34
import subprocess

filepath="D:/path/to/batch/myBatch.bat"
p = subprocess.Popen(filepath, shell=True, stdout = subprocess.PIPE)

stdout, stderr = p.communicate()
print p.returncode # is 0 if success
Community
  • 1
  • 1
  • 3
    `shell=True` is what allows you to run a .bat file instead of an .exe. – Bob Stein May 05 '17 at 21:56
  • 1
    @BobStein-VisiBone no, it's not. You can call a .bat file from Popen without passing shell=True, but as martineau noted in the answer above, you _must_ specify the absolute path to the .bat file. – Nathan Aug 24 '17 at 15:19
16

Replace \ with / in the path

import os
os.system("D:/xxx1/xxx2XMLnew/otr.bat ")
Jason Sturges
  • 15,855
  • 14
  • 59
  • 80
raghuram
  • 161
  • 1
  • 2
  • 2
    i recommend using os.path.normpath filepath="D:/xxx1/xxx2XML/otr.bat" p = Popen(filepath, shell=True, stdout = subprocess.PIPE) stdout, stderr = p.communicate() print process.returncode # is 0 if success –  Dec 10 '12 at 15:03
6

Probably the simplest way to do this is ->

import os
os.chdir("X:\Enter location of .bat file")
os.startfile("ask.bat")
outcast_dreamer
  • 143
  • 2
  • 7
5
  1. It is better to write .bat file in such way that its running is not dependent on current working directory, i.e. I recommend to put this line at the beginning of .bat file:

    cd "%~dp0"
    
  2. Enclose filepath of .bat file in double quotes, i.e.:

    os.system('"D:\\x\\so here can be spaces\\otr.bat" ["<arg0>" ["<arg1>" ...]]')
    
  3. To save output of some batch command in another file you can use usual redirection syntax, for example:

    os.system('"...bat" > outputfilename.txt')
    

    Or directly in your .bat file:

    Application.exe work.xml > outputfilename.txt
    
tav
  • 587
  • 6
  • 9
4

You are just missing to make it raw. The issue is with "\". Adding r before the path would do the work :)

import os
os.system(r"D:\xxx1\xxx2XMLnew\otr.bat")
Prayson W. Daniel
  • 14,191
  • 4
  • 51
  • 57
2

So I do in Windows 10 and Python 3.7.1 (tested):

import subprocess
Quellpfad = r"C:\Users\MeMySelfAndI\Desktop"
Quelldatei = r"\a.bat"
Quelle = Quellpfad + Quelldatei
print(Quelle)
subprocess.call(Quelle)
merlinuwe
  • 191
  • 3
  • 10
1

python_test.py

import subprocess
a = subprocess.check_output("batch_1.bat")
print a

This gives output from batch file to be print on the python IDLE/running console. So in batch file you can echo the result in each step to debug the issue. This is also useful in automation when there is an error happening in the batch call, to understand and locate the error easily.(put "echo off" in batch file beginning to avoid printing everything)

batch_1.bat

echo off    
echo "Hello World" 
md newdir 
echo "made new directory"
Neo
  • 31
  • 5
0

If you are trying to call another exe file inside the bat-file. You must use SET Path inside the bat-file that you are calling. set Path should point into the directory there the exe-file is located:

set PATH=C:\;C:\DOS     {Sets C:\;C:\DOS as the current search path.} 
stefan
  • 10,215
  • 4
  • 49
  • 90
0

If your .bat file is in same directory:

import os
os.startfile("filename.bat")

You can also run Multiple .bat files parallelly this way

os.startfile("filename.bat")
os.startfile("filename2.bat")

--
If you want to change directory before running .bat file, run this command:

os.chdir("X:\directory_inwhich_the_code_will_run")