1. 是否有可能从Python脚本中捕获Python解释器的输出?
  2. 是否可以从Python脚本中捕获Windows CMD的输出?

如果是这样,我应该研究哪个图书馆(y | ies)?

===============>>#1 票数:9 已采纳

如果您正在谈论python解释器或CMD.exe,它是您脚本的“父”,那么不可能。 在每个类似POSIX的系统中(现在你正在运行Windows,看起来可能有一些我不知道的怪癖,YMMV)每个进程都有三个流,标准输入,标准输出和标准错误。 Bu默认(在控制台中运行时)会将这些指向控制台,但可以使用管道符号进行重定向:

python script_a.py | python script_b.py

这将脚本a的标准输出流与脚本B的标准输入流联系起来。在此示例中,标准错误仍然发送到控制台。 请参阅Wikipedia上有关标准流的文章。

如果你正在谈论一个子进程,你可以像这样从python启动它(如果你想要双向通信,stdin也是一个选项):

import subprocess
# Of course you can open things other than python here :)
process = subprocess.Popen(["python", "main.py"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
x = process.stderr.readline()
y = process.stdout.readline()
process.wait()

有关管理进程的信息,请参阅Python 进程模块。 对于通信,process.stdin和process.stdout管道被视为标准文件对象

对于管道使用,从标准输入读取lassevk建议你做这样的事情:

import sys
x = sys.stderr.readline()
y = sys.stdin.readline()

sys.stdin和sys.stdout是上面提到的标准文件对象,在sys模块中定义。 您可能还想查看管道模块。

用我的例子中的readline()读取数据是一种非常天真的获取数据的方法。 如果输出不是面向行或不确定的,你可能想要查看不幸在Windows中不起作用的轮询 ,但我确信那里有一些替代方案。

===============>>#2 票数:5

我想我可以为你问题的第一部分指出一个好的答案。

1.是否可以从Python脚本中捕获Python解释器的输出?

答案是“ ”,我个人喜欢PEP 343中的例子- “with”声明文件。

from contextlib import contextmanager
import sys

@contextmanager
def stdout_redirected(new_stdout):
    saved_stdout = sys.stdout
    sys.stdout = new_stdout
    try:
        yield None
    finally:
        sys.stdout.close()
        sys.stdout = saved_stdout

像这样使用:

with stdout_redirected(open("filename.txt", "w")):
    print "Hello world"

它的一个很好的方面是它可以有选择地应用于脚本执行的一部分,而不是它的整个范围,并且即使在其上下文中引发未处理的异常时也会保持有效。 如果在首次使用后以append-mode重新打开文件,则可以将结果累积到单个文件中:

with stdout_redirected(open("filename.txt", "w")):
    print "Hello world"

print "screen only output again"

with stdout_redirected(open("filename.txt", "a")):
    print "Hello world2"

当然,上述内容也可以扩展为将sys.stderr重定向到相同或另一个文件。 另请参阅相关问题的答案

===============>>#3 票数:3

实际上,你绝对可以,而且同时又美丽,丑陋,疯狂!

您可以使用收集输出的StringIO对象替换sys.stdout和sys.stderr。

这是一个例子,将它保存为evil.py:

import sys
import StringIO

s = StringIO.StringIO()

sys.stdout = s

print "hey, this isn't going to stdout at all!"
print "where is it ?"

sys.stderr.write('It actually went to a StringIO object, I will show you now:\n')
sys.stderr.write(s.getvalue())

运行此程序时,您将看到:

  • 没有什么去stdout(打印通常打印到)
  • 写入stderr的第一个字符串是以'It'开头的字符串
  • 接下来的两行是StringIO对象中收集的行

像这样替换sys.stdout / err是一个叫做monkeypatching的应用程序。 意见可能会有所不同,无论这是否“支持”,它绝对是一个丑陋的黑客,但它在尝试包裹外部东西一两次时节省了我的培根。

在Linux上测试,而不是在Windows上测试,但它也应该可以正常工作。 如果它适用于Windows,请告诉我!

===============>>#4 票数:1

你想要子进程 请参阅17.1.1中的Popen并在17.1.2中进行通信。

===============>>#5 票数:0

你问哪个环境?

您是否尝试从命令行启动的程序中捕获输出?

如果是这样,那么这是如何执行它:

somescript.py | your-capture-program-here

并读取输出,只需从标准输入读取。

另一方面,如果您正在程序中执行该脚本或cmd.exe或类似程序,并希望等到脚本/程序完成并捕获其所有输出,那么您需要查看库您用来启动该外部程序的调用,很可能有一种方法可以让它为您提供一些读取输出并等待完成的方法。

  ask by guillermooo translate from so

未解决问题?本站智能推荐:

2回复

从python脚本执行cmd.exe命令

我在某个目录中有一个python脚本callee.py ,该目录是Windows PATH环境变量的一部分。 在Windows命令提示符cmd.exe我可以简单地执行为 现在,我在另一个目录中有另一个python脚本caller.py 。 要执行的第一个脚本,我想用subproces
1回复

Python中的子进程模块到cmd.exe

我在这里有一些代码试图从Python打开cmd.exe ,并输入一些行以供命令使用。 这里是: 当用我的脚本的其余部分运行时,命令提示符甚至都没有打开,并且似乎根本没有输出或错误。 我的想法是,它甚至都没有运行cmd.exe命令,因此这些代码都无法创建最终输出。 有什么我做
1回复

使用CMD.exe制作在文件夹中运行Python文件的快捷方式

要使用Windows CMD.exe运行Python文件(.py),请按住SHIFT键并右键单击包含所有Python代码文件的项目文件夹。 这样做会显示一个菜单,其中包含“在Open command window here ”选项,我单击该菜单以提示C:\\Users\\Name\\Folde
1回复

使用python调用cmd.exe蝙蝠状命令

我需要一些帮助...我的计算机上安装了一个程序,我想调用该程序来计算一些东西并给我一个输出文件... 在Matlab中,命令“ dos()”完成了我在Matlab中的cmd屏幕输出。 我需要它在python中工作,但我做错了。 “ anw”输出是这样的: 我在pyth
1回复

在Windows shell脚本(cmd.exe)中,如何将程序的标准输出分配给环境变量?

在UNIX中,您可以使用此处说明的技术将脚本的输出分配给环境变量 - 但Windows等效的是什么? 我有一个python实用程序,旨在纠正环境变量。 该脚本只是将一系列字符写入stdout。 出于这个问题的目的,我的实用程序是用python编写的这个事实是无关紧要的,它只是一个程序,
2回复

Python脚本输出未显示在CMD中

在阅读Scrapy教程时,我注意到Python脚本不会导致Windows命令提示符的任何输出。 我确实检查了路径环境变量以确认是否同时包含了“ c:\\ python27”和“ c:\\ python27 \\ Scripts”。 而且我是否相信我已成功安装了Scrapy和所需的依赖项。
2回复

从命令行运行程序,提示输入密码并自动为其提供密码(cmd.exe,python)

我有命令行程序,提示输入密码: 输出(当我从cmd.exe命令行运行它时): 当我手动输入密码时,一切正常。 输出: 我想从命令行或python脚本自动为其提供密码。 我试过了: 一。 从命令行: 不工作 输出: 二。 从python脚
1回复

在打开的cmd for python脚本中输入cmd命令

我的电脑上有一个来宾帐户。 从来宾帐户中,我将使用我的python脚本的sub.process命令启动一个cmd,并启动另一个提升的cmd 然后,将启动提升的cmd,并在该admin cmd中,我要键入其他命令(例如net localgroup管理员newadmin / add)以在脚
1回复

如何截取到Windows 10 cmd.exe的输出并修改以添加颜色?

我正在从命令行调用另一个程序来创建Visual Studio解决方案并进行构建。 该程序输出这些命令的结果。 我想打印以黄色文本输出的警告行,而不是以红色显示默认的灰色和错误行。 假设我的cmd.exe控制台已被修改为支持将ascii2转义码呈现为彩色输出。 我已经做了很多寻找解
2回复

Python 2.7:如何在运行python gui .exe脚本时摆脱cmd窗口

我有一个GUI脚本run.py ,使用pyinstaller将其转换为.exe文件。 当我双击.exe文件时,将打开两个窗口。 首先是我脚本的主GUI,其次是背景上的黑色黑色cmd窗口。 我在论坛上看到将run.py另存为run.pyw ,然后将其转换为.exe文件将解决此问题。 但