【问题标题】:How to open a .cmd file from a python script如何从 python 脚本打开 .cmd 文件
【发布时间】:2018-06-06 14:34:45
【问题描述】:

我有一个.cmd 文件,我想从 python 脚本打开它。 .cmd 文件(一个转换器)在我打开它而不需要在命令窗口中进行任何进一步的交互时完成它的工作。这意味着我只需要从我的脚本中打开它,就是这样。

我尝试了以下...

from subprocess import check_output

def convert():
    subprocess.Popen(['[path to the .cmd file]')

... 但它只打开 cmd 窗口几分之一秒,并且我要运行的实际 .cmd 文件没有执行。要打开路径后面的 .cmd 文件,我需要进行哪些更改?

更新

from subprocess import Popen, PIPE

def convert():
    process = Popen("cmd.exe", shell=False, universal_newlines=True, stdin=PIPE, stdout=PIPE, stderr=PIPE)
    commands = r"C:\\CONVERTER\MFD2MAT\\convert.cmd\n"
    out, err = process.communicate(commands)

【问题讨论】:

  • 您可能需要在脚本中添加pause 或使用/k 执行
  • @Jaxi 你能举个例子吗?
  • 见哈迪的回答。这应该是你想要的。
  • subprocess.check_output(["cmd", "/c", "absolute\\path\\to\\your\\script.cmd"]) 应该可以正常工作。事实上,即使只是调用文件也应该可以工作,我会打印输出以查看发生了什么。
  • @zwer 我认为您的回答有效。我在(“)之前和之后添加了('),现在我没有“访问”“WinError5”

标签: python python-3.x


【解决方案1】:

我将尝试重新解释:

第一种方法:

from subprocess import Popen, PIPE 

process = Popen("cmd.exe", shell=False, universal_newlines=True, stdin=PIPE, stdout=PIPE, stderr=PIPE)


commands = "C:\\Users\\praktikant3\\TESTING.cmd\n" #you can use " " for 1 line of commands or '''  ''' for several lines
out, err = process.communicate(commands)
print(out)

在制定命令时,请记住您的命令 以python字符串的形式,因此:

  • 确保在路径中转义前/反斜杠:C:\.. => C:\\..
  • \n 添加到字符串的末尾以指示换行符来执行您的命令。

在我的代码中,只有使用print(out) 才能看到输出,但是无论如何都会运行 cmd 文件。


第二种方法:

import sys
import os
def run_command(command):
    print("Running command: {}".format(command))
    os.system(command)

commands = "C:\\Users\\praktikant3\\TESTING.cmd"
run_command(commands)

如果您只使用一行命令,这很简洁,而且您不需要换行符\nos.system 为您执行此操作。此外,os.system 将在您的 IDE 中显示输出,而无需打印任何内容。

【讨论】:

  • 我是否必须在 (") 符号之间使用命令窗口手动执行 cmd 文件时使用的路径?
  • 是的,除非 .cmd 文件与您的 python 脚本位于同一当前工作目录中。但是当我使用 subprocess 时,我倾向于总是给出我的文件的路径,不管是为了确定。
  • 这给了我以下错误信息: SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape
  • @Rainer 在你的 cmd 路径字符串前放 r,例如r'cmd.exe'
  • 你记得要避开你的路径前斜线吗? Z.B: C:\Users\praktikant3\ 将变为 C:\\Users\\praktikant3\\
【解决方案2】:

我的 cmd 文件不适用于“Anaconda-Prompt”

解决方案(来自@zwer) 如果这是问题所在,您可以在子进程的子进程中执行命令:

subprocess.call(["cmd", "/k", "start", "", "C:\\CONVERTER\\MFD2MAT\\convert.cmd"], stderr=subprocess.STDOUT) 

但如果由于路径而失败,您可能只想提供一个 cwd 参数并完成它,即:

 subprocess.call("convert.cmd", cwd="C:\\CONVERTER\\MFD2MAT", stderr=subprocess.STDOUT, shell=True)

【讨论】: