【问题标题】:Open .bat from python [duplicate]从python打开.bat [重复]
【发布时间】:2015-08-30 14:43:35
【问题描述】:

我在一个文件夹中有一个.bat,其中有一个名为abcexport.exeexe,其中包含以下代码:

abcexport.exe myswf.swf

像往常一样在 Windows 上双击 bat 会按预期导出 swf

我需要在 python 中执行此操作,但它抱怨 abcexport “不被识别为内部或外部命令”。

我的代码:

尝试 1 -

os.startfile("path\\decompiler.bat")

尝试 2 -

subprocess.call([path\\decompiler.bat"])

还尝试了与os.system()subprocess 方法Popen 相同的方法,并传递参数shell=True 最终结果相同

【问题讨论】:

  • 使用shell=True 运行带有Popen(和call 等)的.bat 是不必要的。底层的CreateProcess 调用知道运行在ComSpec 环境变量中设置的shell。
  • 由于批处理文件依赖于工作目录,因此需要使用cwd参数进行设置。也就是说,.bat 写得不好。它应该将其目录引用为%~dp0,即脚本的 [d]rive 和 [p]ath (arg 0)。
  • 当你双击运行批处理文件时,它可以工作,因为资源管理器将工作目录设置为批处理文件的目录。
  • @eryksun 我的错,这就像一个魅力。非常感谢!!

标签: python windows batch-file cmd


【解决方案1】:

你可以用这个

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

【讨论】:

  • 也使用batch.bat的相对或绝对路径,除非它在搜索PATH或当前进程的工作目录中。
【解决方案2】:

.bat 文件不可执行。您必须使用 cmd.exe(解释器)来“运行它”。试试

import subprocess
executable="path\\decompiler.bat"
p = subprocess.Popen(["C:\Windows\System32\cmd.exe", executable, 'myswf.swf'], shell=True, stdout = subprocess.PIPE)
p.communicate()

按 .bat 工作的顺序

【讨论】:

  • WindowsError: [Error 2] El sistema no puede encontrar el archivo especificado -> 找不到文件.. 将\` with \\`、/// 替换为r"C:\Windows\System32..." 和机器人ossubprocess 方法...
  • 我用更精确的例子更新了我的答案。
  • 另外,确保 abcdexport.exe 在 PATH 中,或者使用 dirname (abcdexport.exe) 作为工作目录(用于 popen args)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-07
  • 1970-01-01
  • 2016-07-20
  • 1970-01-01
  • 2015-03-15
  • 1970-01-01
  • 2016-03-05
相关资源
最近更新 更多