Wurlitzer
Capture C-level stdout/stderr pipes in Python via os.dup2.
For more details on why this is needed, please read this blog post.
Install
pip install wurlitzer
Usage
Capture stdout/stderr in pipes:
from wurlitzer import pipes
with pipes() as (out, err):
call_some_c_function()
stdout = out.read()
Capture both stdout and stderr in a single StringIO object:
from io import StringIO
from wurlitzer import pipes, STDOUT
out = StringIO()
with pipes(stdout=out, stderr=STDOUT):
call_some_c_function()
stdout = out.getvalue()
Forward C-level stdout/stderr to Python sys.stdout/stderr, which may already be forwarded somewhere by the environment, e.g. IPython:
from wurlitzer import sys_pipes
with sys_pipes():
call_some_c_function()
Forward C-level output to Python Logger objects (new in 3.1). Each line of output will be a log message.
from wurlitzer import pipes, STDOUT
import logging
logger = logging.getLogger("my.log")
logger.setLevel(logging.INFO)
logger.addHandler(logging.FileHandler("mycode.log"))
with pipes(logger, stderr=STDOUT):
call_some_c_function()
Forward C-level output to a file (avoids GIL issues with a background thread, new in 3.1):
from wurlitzer import pipes, STDOUT
with open("log.txt", "ab") as f, pipes(f, stderr=STDOUT):
blocking_gil_holding_function()
Or even simpler, enable it as an IPython extension:
%load_ext wurlitzer
To forward all C-level output to IPython (e.g. Jupyter cell output) during execution.
Acknowledgments
This package is based on stuff we learned with @takluyver and @karies while working on capturing output from the Cling Kernel for Jupyter.
Wurlitzer?!
Wurlitzer makes pipe organs. Get it? Pipes? Naming is hard.
Metadata
Release files for wurlitzer 3.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| wurlitzer-3.1.1.tar.gz | 11.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| wurlitzer-3.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 20.5 kB
Release files / wurlitzer-3.1.1.tar.gz
| Download URL | wurlitzer-3.1.1.tar.gz |
|---|---|
| Size | 11.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
bfb9144ab9f02487d802b9ff89dbd3fa382d08f73e12db8adc4c2fb00cd39bd9
|
|
BLAKE2b-256 checksum How to use checksums |
3390623f99c55c7d0727a58eb2b7dfb65cb406c561a5c2e9a95b0d6a450c473d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/5.1.0 CPython/3.8.19
|
Release files / wurlitzer-3.1.1-py3-none-any.whl
| Download URL | wurlitzer-3.1.1-py3-none-any.whl |
|---|---|
| Size | 8.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
0b2749c2cde3ef640bf314a9f94b24d929fe1ca476974719a6909dfc568c3aac
|
|
BLAKE2b-256 checksum How to use checksums |
9a2493ce54550a9dd3fd996ed477f00221f215bf6da3580397fbc138d6036e2e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/5.1.0 CPython/3.8.19
|