【问题标题】:Run a .bat file using python code使用 python 代码运行 .bat 文件
【发布时间】:2011-03-29 07:37:20
【问题描述】:

我尝试使用 Python 脚本在 Windows 中运行 .bat 文件。

ask.bat文件:

Application.exe work.xml

我编写 Python 代码:

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

输出:当尝试运行文件时,它只是给命令提示符一个闪烁,并且工作没有执行。

注意:我也尝试使用备用斜线,但它不起作用。

我还想将文件的输出保存在另一个文件中。

谁能建议我如何使脚本可运行。

【问题讨论】:

  • 您是否尝试转义反斜杠?试试看:os.system("D:\\xxx1\\xxx2XMLnew\\otr.bat ")
  • 如果您不想转义,请使用 / 而不是 \

标签: python batch-file


【解决方案1】:

这已经在 SO 上得到了详细的回答。看看这个帖子,它应该回答你所有的问题: Executing a subprocess fails

我自己用这段代码试过了:

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

我从上述线程中获得了 batchtest.py 示例。

【讨论】:

  • 嗨 das_weezul,感谢您提供的信息。我尝试了那里提到的内容,但对我来说,同样的问题仍然存在,在执行时,应用程序一眨眼。来了就出去了,没有工作进行
  • 运行此代码时遇到错误:“Windows 错误 2:系统找不到指定的文件”,但文件路径 100% 正确,我切换文件夹位置以测试您所说的....代码来自子进程 import Popen p = Popen("test.bat", cwd=r"C:\XMLnew") stdout, stderr = p.communicate()
  • @Silver: Popen() 找不到 test.bat 文件。在docs 中它说“如果cwd 不是None,则在执行之前,子目录的当前目录将更改为cwd。请注意,此目录不是在搜索可执行文件时考虑,因此您不能指定程序相对于 cwd 的路径。"
  • @martineau 他使用了绝对路径“C:\XMLnew”,所以这应该不是问题
  • @das_weezul:是的,但"test.bat" 是相对的。
【解决方案2】:
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

【讨论】:

  • shell=True 允许您运行 .bat 文件而不是 .exe。
  • @BobStein-VisiBone 不,不是。您可以在不传递 shell=True 的情况下从 Popen 调用 .bat 文件,但正如 martineau 在上面的答案中指出的那样,您必须指定 .bat 文件的绝对路径。
【解决方案3】:

将路径中的\替换为/

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

【讨论】:

  • 我推荐使用 os.path.normpath filepath="D:/xxx1/xxx2XML/otr.bat" p = Popen(filepath, shell=True, stdout = subprocess.PIPE) stdout, stderr = p.communicate() print process.returncode #如果成功则为0
【解决方案4】:
  1. .bat文件最好写成运行不依赖于当前工作目录的方式,即我建议将此行放在.bat文件的开头:

    cd "%~dp0"
    
  2. .bat 文件的路径用双引号括起来,即:

    os.system('"D:\\x\\so here can be spaces\\otr.bat" ["<arg0>" ["<arg1>" ...]]')
    
  3. 要将某些批处理命令的输出保存在另一个文件中,您可以使用通常的redirection syntax,例如:

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

    或直接在您的.bat 文件中:

    Application.exe work.xml > outputfilename.txt
    

【讨论】:

    【解决方案5】:

    可能最简单的方法是 ->

    import os
    os.chdir("X:\Enter location of .bat file")
    os.startfile("ask.bat")
    

    【讨论】:

    • 不确定其他操作系统,但适用于 windows :)
    【解决方案6】:

    你只是想把它变成原始的。问题在于“\”。在路径之前添加 r 可以完成工作:)

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

    【讨论】:

      【解决方案7】:

      所以我在 Windows 10 和 Python 3.7.1(已测试)中这样做:

      import subprocess
      Quellpfad = r"C:\Users\MeMySelfAndI\Desktop"
      Quelldatei = r"\a.bat"
      Quelle = Quellpfad + Quelldatei
      print(Quelle)
      subprocess.call(Quelle)
      

      【讨论】:

        【解决方案8】:

        python_test.py

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

        这提供了批处理文件的输出以在 python IDLE/运行控制台上打印。因此,在批处理文件中,您可以在每个步骤中回显结果以调试问题。当批处理调用中发生错误时,这在自动化中也很有用,以便轻松理解和定位错误。(在批处理文件开始时将“echo off”放置以避免打印所有内容)

        batch_1.bat

        echo off    
        echo "Hello World" 
        md newdir 
        echo "made new directory"
        

        【讨论】:

          【解决方案9】:

          如果您尝试调用 bat 文件中的另一个 exe 文件。 您必须在您正在调用的bat-文件中使用SET Path。 设置路径应该指向exe-文件所在的目录:

          set PATH=C:\;C:\DOS     {Sets C:\;C:\DOS as the current search path.} 
          

          【讨论】:

            猜你喜欢
            • 2017-10-30
            • 1970-01-01
            • 2018-03-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多