Thread safe stdio proxy
Project description
stdio_proxy
stdio_proxy is a thread-safe library for Python 2.7 and Python 3.5+ that can temporarily redirect stdio to another objects.
Background
Python 3.5+ has redirect_stdout and redirect_stderr in contextlib, that are utility functions for temporarily redirecting sys.stdout and sys.stderr to another file-like objects, respectively.
But those functions have the global side effect on sys.stdout and sys.stderr.
That means we cannot use those functions in most threaded applications.
- Python code
import contextlib
import io
import time
from concurrent.futures import ThreadPoolExecutor
def run(value):
for i in range(2):
print("Hello from {}:{}".format(value, i))
time.sleep(1)
def run_hook(value):
buf = io.StringIO()
with contextlib.redirect_stdout(buf):
run(value)
return buf.getvalue()
with ThreadPoolExecutor() as executor:
f1 = executor.submit(run, "th1")
f2 = executor.submit(run_hook, "th2")
f1.result()
result = f2.result()
print("===Done===")
print("Redirected Stdout:\n{}".format(result))
- What we want
Hello from th1:0
Hello from th1:1
===Done===
Redirected Stdout:
Hello from th2:0
Hello from th2:1
- Example of actual output
Hello from th1:0
===Done===
Redirected Stdout:
Hello from th2:0
Hello from th1:1
Hello from th2:1
This library aims to redirect those stdio correctly in threaded applications as well.
By just replacing run_hook function with the following code, the result would be exactly the same as "what we want" :)
def run_hook(value):
buf = io.BytesIO()
with stdio_proxy.redirect_stdout(buf):
run(value)
return buf.getvalue()
Install
$ pip install stdio-proxy
Usage
- Redirect a buffer to
stdin
buf = io.BytesIO(b"foo\n")
with stdio_proxy.redirect_stdin(buf):
print("Read: {}".format(sys.stdin.readline()))
- Redirect
stdoutto a buffer
buf = io.BytesIO()
with stdio_proxy.redirect_stdout(buf):
print("foo")
print("Redirected: {}".format(buf.getvalue()))
- Redirect
stderrto a buffer
buf = io.BytesIO()
with stdio_proxy.redirect_stderr(buf):
sys.stderr.write("foo\n")
print("Redirected: {}".format(buf.getvalue()))
License
MIT License
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file stdio_proxy-0.1.3-py3-none-any.whl.
File metadata
- Download URL: stdio_proxy-0.1.3-py3-none-any.whl
- Upload date:
- Size: 6.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/42.0.1 requests-toolbelt/0.9.1 tqdm/4.40.1 CPython/3.6.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ddbb8bf6e56e3ed7cafd71bf8a9facd9582e8392ad89f7898182f020edd5e365
|
|
| MD5 |
e4beacf33752f132c8a5e1fee8001fd9
|
|
| BLAKE2b-256 |
5cf8b48162d4e996810e37504f925f14121d38eb0e1ae5eb230c4f39a448b86d
|
File details
Details for the file stdio_proxy-0.1.3-py2-none-any.whl.
File metadata
- Download URL: stdio_proxy-0.1.3-py2-none-any.whl
- Upload date:
- Size: 6.3 kB
- Tags: Python 2
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/42.0.1 requests-toolbelt/0.9.1 tqdm/4.40.1 CPython/3.6.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9bf9cdaa4b68b0abf25eccf372de9e6497f91096390a5c53b219b394ffb1fbfd
|
|
| MD5 |
63f749ecc3c1e849ebe4a03abbcdb1db
|
|
| BLAKE2b-256 |
0942629491ff2ac35f4a1af3ea18c6444a020bcd63c85bdcd526d34d68b68238
|