【问题标题】:Retrieving the command output of a hidden console?检索隐藏控制台的命令输出?
【发布时间】:2013-06-25 17:46:54
【问题描述】:

我从 python 环境运行 DOS 命令,该命令通过标准输出检索其命令输出。

除了每次运行脚本时都会弹出 windows 控制台外,一切都工作正常,所以我需要一种隐藏 windows 控制台的方法。

从示意图上看,这是预期的过程:

"Console1" runs "hidden Console2" and retrieves its output into "Console1"

我阅读了一些关于“HiddenStart”或“chp”等软件的建议,它们在执行 DOS 命令和批处理脚本时会隐藏控制台。 VBScript中的另一种解决方案也可以使用以下代码实现此结果:

Set oShell = CreateObject ("Wscript.Shell")
Dim strArgs
strArgs = "cmd /c COMMAND GOES HERE"
oShell.Run strArgs, 0, false

但不幸的是,“HiddenStart”、“chp”和 VBScript 脚本都不允许检索已执行命令的命令输出。 "Chp" 输出标准输出,但仅用于退出进程代码。

有人可能会说,可以将结果记录到磁盘上的文件中,然后检索文件的内容,但这不是所需的,导致过程更加复杂。

所以,我想知道是否可以从隐藏的控制台检索命令输出,是吗?

解决方案:

How to avoid console window with .pyw file containing os.system call?

帖子作者的注意事项: 嗨,这是我第一次来这里,这个问题不是重复的,而是一个变体。证明是我之前进行了搜索,在我真正写下问题之前很难找到解决方案。所以,版主需要比这更微妙一些。我认为这是一个链接的、相关的问题或变体,但不是重复的。谢谢。

【问题讨论】:

标签: python command-line vbscript dos stdout


【解决方案1】:

以 Windows 为中心的解决方案可以基于来自this VBScript 的“端口”:

mother.py:

import win32com.client
oWS = win32com.client.Dispatch("WScript.Shell")
print("A", "mother starts child")
oEx = oWS.Exec("cscript ..\\vbs\\child.vbs")
while not oEx.Stdout.AtEndOfStream:
   print(oEx.Stdout.ReadLine())
print("B", "mother done")

输出:

A mother starts child
1 child
2 child
3 child
4 child
5 child
B mother done

(ActiveState Python 3.2.2;从prints 中删除 () 会得到 2.x 版本(使用 ActiveState Python 2.5.2 测试);要使用像 dir 这样的内在函数,请在前面加上 "%comspec% / c")

【讨论】:

  • 谢谢埃克哈德。请注意,我使用的是 python 环境,但无法轻松访问 pywin32 等第三方模块。因此,正如我在第一篇文章末尾指出的那样,一个解决方案是标记“Shell=True”子流程方法,它按第一个要求的预期工作。
  • 标志解决方案仅适用于 python,也就是说。在 Windows DOS 命令中,问题仍然处于打开状态。
【解决方案2】:

尝试子流程管道示例以了解如何做到这一点。

【讨论】:

  • 谢谢,你能说得更清楚些吗?这是我在 python 脚本中使用的代码: process = subprocess.Popen(command.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
  • 这是真的,但评论不是答案。无论如何,谢谢巴恩斯先生。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-20
  • 1970-01-01
  • 2020-05-31
  • 1970-01-01
  • 2017-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多