고유의 표준 외부를 사용하는 경우 많고 많은 버퍼로 리디렉션 할 수 있습니까?
ftplib
작은 FTP 클라이언트를 작성하기 위해 제공하는 함수를 사용 하고 패키지의 일부 함수를 사용하는 것을 반환하지 않습니다 stdout
. stdout
출력을 읽을 수있는 객체 로 리디렉션하고 싶습니다 .
다음 stdout
을 사용하여 일반 파일로 리디렉션 할 수있는 것을 알고 있습니다.
stdout = open("file", "a")
그러나 로컬 드라이브를 사용하지 않는 방법을 선호합니다.
BufferedReader
사용할 수있는 Java 와 같은 것을 찾고 있습니다.
from cStringIO import StringIO # Python3 use: from io import StringIO
import sys
old_stdout = sys.stdout
sys.stdout = mystdout = StringIO()
# blah blah lots of code ...
sys.stdout = old_stdout
# examine mystdout.getvalue()
Python 3.4 에는 contextlib.redirect_stdout () 함수 가 있습니다.
import io
from contextlib import redirect_stdout
with io.StringIO() as buf, redirect_stdout(buf):
print('redirected')
output = buf.getvalue()
이전 Python 버전에서 구현하는 방법을 사용하여 코드 예제는 다음과 있습니다.
위의 Ned의 답변에 추가하기 : 쓰기 (str) 메소드를 구현하는 객체로 출력을 리디렉션 할 수 있습니다 .
이 GUI 응용 프로그램에서 stdout 출력을 "catch"하는 데 있습니다.
PyQt의 어리석은 예는 다음과 다양합니다.
import sys
from PyQt4 import QtGui
class OutputWindow(QtGui.QPlainTextEdit):
def write(self, txt):
self.appendPlainText(str(txt))
app = QtGui.QApplication(sys.argv)
out = OutputWindow()
sys.stdout=out
out.show()
print "hello world !"
Python 2.6부터는 io 모듈에서 TextIOBase
API 를 구현하는 모든 것을 대체물로 사용할 수 있습니다 . 이 솔루션은 또한 사용할 수 있습니다 sys.stdout.buffer.write()
(참조 표준 출력에 쓰기 표준 출력 3에서 (이미) 된 바이트 인코딩을 표준 출력 ). StringIO
그러면 사용할 수 sys.stdout.encoding
없으며 sys.stdout.buffer
사용할 수 없기 때문에 사용 이 작동하지 않습니다 .
TextIOWrapper를 사용하는 솔루션 :
import sys
from io import TextIOWrapper, BytesIO
# setup the environment
old_stdout = sys.stdout
sys.stdout = TextIOWrapper(BytesIO(), sys.stdout.encoding)
# do something that writes to stdout or stdout.buffer
# get output
sys.stdout.seek(0) # jump to the start
out = sys.stdout.read() # read output
# restore stdout
sys.stdout.close()
sys.stdout = old_stdout
이 솔루션은 Python 2> = 2.6 및 Python 3에서 작동합니다.
우리의 새로운 기능 sys.stdout.write()
은 유니 코드 sys.stdout.buffer.write()
만 허용하고 바이트 수 만 허용합니다. 이 Python 2 및 3에서 변경없이 실행 빌드 된 코드의 경우 종종 있습니다 sys.stdout.buffer
.
다음에 대해 유니 코드 및 다음에 허용되는 약간의 변형을 허용 write()
합니다.
class StdoutBuffer(TextIOWrapper):
def write(self, string):
try:
return super(StdoutBuffer, self).write(string)
except TypeError:
# redirect encoded byte strings directly to buffer
return super(StdoutBuffer, self).buffer.write(string)
버퍼의 인코딩을 sys.stdout.encoding으로 테스트하는 것은 없지만 펼쳐지는 방법을 사용할 때 도움이됩니다.
이 방법은 예외가 있어도 sys.stdout을 복원합니다. 또한 예외 전에 모든 출력을 가져옵니다.
import io
import sys
real_stdout = sys.stdout
fake_stdout = io.BytesIO() # or perhaps io.StringIO()
try:
sys.stdout = fake_stdout
# do what you have to do to create some output
finally:
sys.stdout = real_stdout
output_string = fake_stdout.getvalue()
fake_stdout.close()
# do what you want with the output_string
Python 2.7.10에서 테스트 io.BytesIO()
Python 3.6.4에서 테스트 io.StringIO()
Bob, 수정 된 / 확장 된 코드 실험에서 어떤 의미에서든 흥미로울 수있는면 케이스에 추가되었습니다. 않으면 오는가 자유롭게 삭제할 수 있습니다.
광고 정보 ... (GUI를 정리하고 필요한 보고서에 세부 정보를 수집하는 경우
numexpr.print_versions()
) 에 직접 지시 출력을 "잡기"하기 위해 실행 가능한 한 찾는 동안 확장 된 실험에서 얻은 몇 가지 발언<stdout>
# THIS WORKS AS HELL: as Bob Stein proposed years ago:
# py2 SURPRISEDaBIT:
#
import io
import sys
#
real_stdout = sys.stdout # PUSH <stdout> ( store to REAL_ )
fake_stdout = io.BytesIO() # .DEF FAKE_
try: # FUSED .TRY:
sys.stdout.flush() # .flush() before
sys.stdout = fake_stdout # .SET <stdout> to use FAKE_
# ----------------------------------------- # + do what you gotta do to create some output
print 123456789 # +
import numexpr # +
QuantFX.numexpr.__version__ # + [3] via fake_stdout re-assignment, as was bufferred + "late" deferred .get_value()-read into print, to finally reach -> real_stdout
QuantFX.numexpr.print_versions() # + [4] via fake_stdout re-assignment, as was bufferred + "late" deferred .get_value()-read into print, to finally reach -> real_stdout
_ = os.system( 'echo os.system() redir-ed' )# + [1] via real_stdout + "late" deferred .get_value()-read into print, to finally reach -> real_stdout, if not ( _ = )-caught from RET-d "byteswritten" / avoided from being injected int fake_stdout
_ = os.write( sys.stderr.fileno(), # + [2] via stderr + "late" deferred .get_value()-read into print, to finally reach -> real_stdout, if not ( _ = )-caught from RET-d "byteswritten" / avoided from being injected int fake_stdout
b'os.write() redir-ed' )# *OTHERWISE, if via fake_stdout, EXC <_io.BytesIO object at 0x02C0BB10> Traceback (most recent call last):
# ----------------------------------------- # ? io.UnsupportedOperation: fileno
#''' ? YET: <_io.BytesIO object at 0x02C0BB10> has a .fileno() method listed
#>>> 'fileno' in dir( sys.stdout ) -> True ? HAS IT ADVERTISED,
#>>> pass; sys.stdout.fileno -> <built-in method fileno of _io.BytesIO object at 0x02C0BB10>
#>>> pass; sys.stdout.fileno()-> Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
# io.UnsupportedOperation: fileno
# ? BUT REFUSES TO USE IT
#'''
finally: # == FINALLY:
sys.stdout.flush() # .flush() before ret'd back REAL_
sys.stdout = real_stdout # .SET <stdout> to use POP'd REAL_
sys.stdout.flush() # .flush() after ret'd back REAL_
out_string = fake_stdout.getvalue() # .GET string from FAKE_
fake_stdout.close() # <FD>.close()
# +++++++++++++++++++++++++++++++++++++ # do what you want with the out_string
#
print "\n{0:}\n{1:}{0:}".format( 60 * "/\\",# "LATE" deferred print the out_string at the very end reached -> real_stdout
out_string #
)
'''
PASS'd:::::
...
os.system() redir-ed
os.write() redir-ed
/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
123456789
'2.5'
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Numexpr version: 2.5
NumPy version: 1.10.4
Python version: 2.7.13 |Anaconda 4.0.0 (32-bit)| (default, May 11 2017, 14:07:41) [MSC v.1500 32 bit (Intel)]
AMD/Intel CPU? True
VML available? True
VML/MKL version: Intel(R) Math Kernel Library Version 11.3.1 Product Build 20151021 for 32-bit applications
Number of threads used by default: 4 (out of 4 detected cores)
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
>>>
EXC'd :::::
...
os.system() redir-ed
/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
123456789
'2.5'
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Numexpr version: 2.5
NumPy version: 1.10.4
Python version: 2.7.13 |Anaconda 4.0.0 (32-bit)| (default, May 11 2017, 14:07:41) [MSC v.1500 32 bit (Intel)]
AMD/Intel CPU? True
VML available? True
VML/MKL version: Intel(R) Math Kernel Library Version 11.3.1 Product Build 20151021 for 32-bit applications
Number of threads used by default: 4 (out of 4 detected cores)
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
Traceback (most recent call last):
File "<stdin>", line 9, in <module>
io.UnsupportedOperation: fileno
'''
Python3.6에서는 StringIO
및 cStringIO
모듈이 없어 졌으므로 io.StringIO
대신 사용해야하므로 첫-th 답변과 같이 수행해야 우리합니다.
import sys
from io import StringIO
old_stdout = sys.stdout
old_stderr = sys.stderr
my_stdout = sys.stdout = StringIO()
my_stderr = sys.stderr = StringIO()
# blah blah lots of code ...
sys.stdout = self.old_stdout
sys.stderr = self.old_stderr
// if you want to see the value of redirect output, be sure the std output is turn back
print(my_stdout.getvalue())
print(my_stderr.getvalue())
my_stdout.close()
my_stderr.close()
pipe()
파일 설명자를 적절한 사용 하고 write- 하십시오 .
https://docs.python.org/library/os.html#file-descriptor-operations
python3의 빠른 관리자 :
import sys
from io import StringIO
class RedirectedStdout:
def __init__(self):
self._stdout = None
self._string_io = None
def __enter__(self):
self._stdout = sys.stdout
sys.stdout = self._string_io = StringIO()
return self
def __exit__(self, type, value, traceback):
sys.stdout = self._stdout
def __str__(self):
return self._string_io.getvalue()
다음과 같이 사용하십시오.
>>> with RedirectedStdout() as out:
>>> print('asdf')
>>> s = str(out)
>>> print('bsdf')
>>> print(s, out)
'asdf\n' 'asdf\nbsdf\n'
'IT' 카테고리의 다른 글
bash의 디렉토리에서 임의의 파일을 어떻게 선택합니까? (0) | 2020.07.14 |
---|---|
SQL Server에서 노드를 자르는 방법? (0) | 2020.07.14 |
rbenv install 명령이 없습니다 (0) | 2020.07.14 |
Chrome이 XMLHttpRequest를 사용하여 로컬 파일에서 URL을로드하도록 허용 (0) | 2020.07.14 |
검색 결과에서 폴더 무시 (0) | 2020.07.14 |