簡體   English   中英

在python中捕獲僅stdout的輸出

[英]Capture the output of ONLY stdout in python

PYTHON版本-3.5.2 操作系統-Ubuntu 16.04 LTS

我目前正在同時使用stdout和print語句寫入終端。 我想捕獲僅sys.stdout.write命令而非打印命令的輸出,因此例如,如果我的代碼是-

import sys
sys.stdout.write("Hello")
print("PRINT")

我只想捕獲“ Hello”而不是“ PRINT”。

我目前正在使用這個:

x = subprocess.run(['python3 test.py'] , shell = True , stdout = subprocess.PIPE).stdout.decode('utf-8')

這給了我這個輸出:

['HelloPRINT', '']

print()使用sys.stdout.write()顯示text。

除了suproccess只能看到系統發送的文本,並且不知道您過去向系統發送文本的方式。

您只能在代碼中將print()重定向到sys.stderr

import sys
sys.stdout.write("Hello")
print("PRINT", file=sys.stderr)

然后,當您在控制台中運行時,您仍然會看到所有文本,但是當您使用subprocess sys.stdout時,您只會得到sys.stdout

如果在控制台中使用,您還將僅在文件中獲得stdout

python script.py > stdout.txt

或者您重定向到其他程序

python script.py | sort

除了print(... ,file=sys.stderr)您還可以使用sys.stderr.write("PRINT\\n")但必須在末尾手動添加"\\n"

您無法執行此操作,因為print() sys.stdout.write()內部使用sys.stdout.write() 以下REPL會話說明了這一點:

>>> import sys
>>> class StdoutProxy:
...  def write(self, text):
...   return len(text) # do nothing
...
>>> sys.stdout = StdoutProxy()
>>> print("Hello!")
>>> sys.stdout = sys.__stdout__  # reset stdout to its original state
>>> print("Hello!")
Hello!

您可以這樣定義自己的print功能版本:

import sys

def get_my_print(file=sys.stdout):
    _original_print = print
    def my_print(*objects, sep='', end='\n', file=file, flush=False):
        _original_print(*objects, sep='', end='\n', file=file, flush=False)
    return my_print

original_print = print
print("Redirect print to stderr...")
print = get_my_print(sys.stderr)

print("Print some numbers...")
for x in range(10):
    print(x)

print = original_print
print("Done.")

安慰

$ python3 redirect_print.py 1> /dev/null
Print some numbers...
0
1
2
3
4
5
6
7
8
9

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM