【问题标题】:Launch a batch file stored in different directory from Python script in another directory从另一个目录中的 Python 脚本启动存储在不同目录中的批处理文件
【发布时间】:2016-08-25 10:42:02
【问题描述】:

我创建了一个 Python 脚本,它需要根据某些条件启动 .bat 文件。

Python 脚本位置:\Component\myScript.py

批处理文件位置:\Component\MS20160825\toExecute.bat
批处理文件内部使用了一些位于 \Component\bin\ 中的可执行文件

我该怎么做:

  1. 从 Python 脚本启动 .BAT 文件,以便 .BAT 成功执行。 BAT 文件应该能够在 \Component\bin\ 目录中找到可执行文件来执行其任务并产生所需的结果。

  2. 保持 Python 脚本执行,直到 .BAT 完成执行。

  3. .BAT 文件有 pause >nul 语句。我需要绕过它,这意味着当从 Python 脚本执行 .BAT 时,它不应该等待用户按 Enter 而是应该在执行倒数第二个语句后正常终止。因为同一个.BAT文件需要执行多次。

【问题讨论】:

  • 使用NoPause 之类的参数从Python 脚本运行批处理文件,并在批处理文件if /I not "%~1" == "NoPause" pause >nul 中使用。在命令提示符窗口call /? 中运行以获取有关如何使用批处理文件参数的帮助。 %0 引用参数 0,即批处理文件本身。 %~dp0 是例如以反斜杠结尾的批处理文件的驱动器和路径。这可能有助于从批处理文件中使用相对于批处理文件路径的路径引用其他文件夹/文件。
  • 关于相对路径:以\Component\myScript.py 之类的反斜杠开头的路径相对于当前驱动器的根目录。以..\ 开头的路径引用当前目录的父目录。并且以.\ 开头或以文件夹或文件名开头的路径是相对于当前目录的。
  • 是的,这是一个打字错误。感谢 Mofi 指出。

标签: python batch-file subprocess call popen


【解决方案1】:

应该可以解决您遇到的所有问题!

import subprocess

p = subprocess.Popen('batch.bat', shell=True, stdin=subprocess.PIPE)
stdout, stderr = p.communicate()

【讨论】:

  • 感谢您的解决方案。它有效,但需要一个小的修正。即
【解决方案2】:

感谢大家的积极建议。
以下代码对我有用:

import subprocess

batchFileLocation = 'Component\\MS20160825'
batchFileFullPath = os.path.join(batchFileLocation, 'toExecute.bat')

p = subprocess.Popen(os.path.abspath(batchFileFullPath), stdin=subprocess.PIPE, cwd = batchFileLocation)
stdout,stderr = p.communicate()

这里的cwd参数非常重要,需要将其更新为批处理文件所在的位置,然后才能正确执行批处理文件。

之后,只有批处理文件才能搜索执行所需的二进制文件(在这种情况下,它位于 Component\bin\ 等不同的目录中)。

【讨论】:

    猜你喜欢
    • 2015-11-28
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 2016-12-04
    • 2010-09-10
    • 2013-11-17
    • 2013-04-11
    • 1970-01-01
    相关资源
    最近更新 更多