【问题标题】:Closing console application after completion from Python从 Python 完成后关闭控制台应用程序
【发布时间】:2011-12-27 23:17:05
【问题描述】:

我有一个 exe 文件,我必须使用几个参数调用它,为此我使用了一个 bat 文件。我执行bat文件后命令提示符没有关闭,而是等我按一个键。现在我必须多次运行这个 exe,为此我想运行一个脚本来为我做这件事。

i = 0
for path in Paths
    outout = codecs.open('runExe.bat', 'w')
    output.write(PathToExe + " -param1" + " -param2 " + param2Val[0] + " -param3 " + param3Val[0] + " -param4 " + param4Val[0] + " -param5 param5Val")
    output.close()
    subprocess.call(["regsvr32.exe", path, "-u", "-s"])
    subprocess.call(["regsvr32.exe", path, "-s"])
    subprocess.call("runExe.bat")
    i + = 1

其中 param3Val、param4Val、param5Val 是包含相关命令提示参数值的列表。
当我调用这个 bat 文件时,一切都非常适合 exe 的第一个乐趣,但是在它执行之后,命令提示符等待我的响应。当我按任意键时,它会关闭,然后 exe 文件以不同的参数启动。
所以我想用按键来消除。我试图将“退出”放在 bat 文件的末尾,但它不起作用。当 exe 完成工作时,如何从脚本关闭命令提示符窗口?
提前致谢! Upd1:sarmold 的做事方式很好,但我认为这是 exe(控制台应用程序)正在等待我的回复。 exe 文件中的 Smth 阻止控制台窗口关闭,但我无权访问源。执行后如何关闭它的窗口?

Upd2:我尝试在 subprocess.call 之后添加“shell”调用,但这似乎也不起作用,仍然需要手动响应控制台:(

shell = win32com.client.Dispatch("WScript.Shell")
shell.AppActivate("Command Prompt")
shell.SendKeys("cls(ENTER)")

【问题讨论】:

  • +1,但我想提两件事。不建议对 Paths 和 PathToExe 等变量使用 CamelCase:最好使用小写字母或大写字母(用于常量)。我建议您查看 PEP 8 (python.org/dev/peps/pep-0008)。此外,您可以考虑使用通常的形式" ".join(PathToExe, '-param1 -param2', param2Val[0], '-param3',…),而不是将许多包含空格的字符串连接在一起。
  • Windows 是否支持管道?如果是,也许您可​​以向regsvr32.exe 发送一个字符,就像您按下一个键一样?在 Unix 下,您可以做到 echo | <cmd><cmd> 接收换行符。
  • 感谢 EOL,对于 pep 链接,将阅读它。嗯,谢谢,我会努力寻找管道解决方案!

标签: python windows command-line batch-file


【解决方案1】:

您是否以每次运行runExe.bat 时都会启动命令提示符的方式运行它?它不应该必须等待您关闭控制台,但既然这样,请尝试使用subprocess.call("cmd /C runExe.bat") 运行您的脚本。

@Arnold 是对的,不过:最好简化您的设置并(恕我直言)让 python 处理所有事情。

【讨论】:

    【解决方案2】:

    这里有两种可能的方法:

    1. 只创建一个包含所有命令(包括 regsvr32.exe 命令)的 bat 文件,然后执行该文件。

    2. 让 Python 脚本为您完成所有工作。

    对于第一种方法,使用"a" 打开模式追加到批处理文件。 (也许在脚本启动时将其删除。)将三个命令的内容写入循环内的批处理文件——这样您就可以得到一个包含所有您需要的命令的 long 批处理文件。

    然后在循环之外,在脚本末尾调用一次subprocess.call() 命令来运行整个事情。

    对于第二种方法,删除 all 批处理文件写入并使用 Python 的 subprocess.call() 运行您的 PathToExe。这几乎就像删除所有与output 一起使用的行一样简单,但是将output.write() 更改为subprocess.call()——显然,稍微修改一下内容,以便它们直接用于subprocess.call()

    【讨论】:

      猜你喜欢
      • 2016-01-31
      • 1970-01-01
      • 2018-12-07
      • 1970-01-01
      • 2016-01-04
      • 2015-10-19
      • 2012-10-05
      • 1970-01-01
      • 2010-12-24
      相关资源
      最近更新 更多