Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/javascriptdude/textiotrap
Python Helpers For Capturing TextIO Streams
https://github.com/javascriptdude/textiotrap
Last synced: about 2 months ago
JSON representation
Python Helpers For Capturing TextIO Streams
- Host: GitHub
- URL: https://github.com/javascriptdude/textiotrap
- Owner: JavaScriptDude
- License: bsd-3-clause
- Created: 2022-04-05T05:18:47.000Z (almost 3 years ago)
- Default Branch: main
- Last Pushed: 2022-04-06T04:39:38.000Z (almost 3 years ago)
- Last Synced: 2024-12-02T03:45:48.280Z (2 months ago)
- Language: Python
- Size: 21.5 KB
- Stars: 1
- Watchers: 3
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Changelog: changelog
- License: LICENSE
Awesome Lists containing this project
README
## TextIOTrap
Simple class for trapping / capturing Python Text IO streams like from `subprocess.popen`, `pexpect`, `sys.stderr` and others; enabling the capture output of or dropping streams with cross platform `DEVNULL` helper.
### Installation
```
python3 -m pip install tiotrap
```### Usage
This tool contains one class `TextIOTrap` and a helper `DEVNULL`.
### Examples
#### (Ex1) Use `TextIOTrap` to capture stdout of a chatty process using `store` option:
```python3
_stdout_bk = sys.stdout # Store original stdout
ttrap = tiotrap.TextIOTrap(store=True)try:
sys.stdout = ttrap # Map stdout to tiotrap
print("TEST1")
# call some chatty functions()
print("TEST2")finally:
sys.stdout = _stdout_bk # Restore stdout
```
Output of print:
```
captured logs:
TEST1TEST2
```#### (Ex2) Use `TextIOTrap` to capture stdout using `write_handler` option:
```python3
aTrap = []
_stdout_bk = sys.stdout
try:
sys.stdout = tiotrap.TextIOTrap(write_handler=lambda s: aTrap.append(s))
print("TEST1")
print("TEST2")finally:
sys.stdout = _stdout_bk
# print adds extra \n end so remove with rstrip()
print(f"aTrap:\n{''.join(aTrap).rstrip()}\n~end~\n")
```Output of print:
```
aTrappedStdout = ['TEST1', 'TEST2']
```
You can substitute lambda with a function or method call to handle `writes` with your own code.#### (Ex3) Use `TextIOTrap` grab output `pexpect` call :
```python3
ttrap = tiotrap.TextIOTrap(store=True)p = pexpect.spawn('ls -la')
p.logfile = ttrap
p.expect(pexpect.EOF)print(f"`ls -la` cmd output:\n{ttrap.entries()}\n~")
```Output of print:
```
ls output:```
Other uses of `TextIOTrap`:
* Output the stdout of a `subprocess.popen` call in real time to a secondary log file
* ...#### (Ex4) Use `TextIOTrap` grab output `pexpect` call :
```python3
ttrap = tiotrap.TextIOTrap(store=True)p = pexpect.spawn('ls -la')
p.logfile = ttrap
p.expect(pexpect.EOF)print("ls -la` cmd output (as was written):")
for write in ttrap:
print(write)
```
Output: Similar to Ex4#### (Ex5) Use `DEVNULL` to drop all output of a TextIO Stream
```python3
_stdout_bk = sys.stdouttry:
sys.stdout = tiotrap.DEVNULL
print("THIS WILL NOT PRINT")finally:
sys.stdout = _stdout_bkprint("THIS WILL PRINT")
```
This DEVNULL is very simple implementation and is fully cross platform unlike someother DEVNULL implementations.Note:` TextIOTrap` has been set up to be compatible with the standard methods for a Text IO streams. I'll be glad to update if any edge cases are discovered.