Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/haarcuba/pimped_subprocess
a pimped-up wrapper around Python's subprocess module that can monitors the subprocess output line by line
https://github.com/haarcuba/pimped_subprocess
death monitor subprocess
Last synced: about 15 hours ago
JSON representation
a pimped-up wrapper around Python's subprocess module that can monitors the subprocess output line by line
- Host: GitHub
- URL: https://github.com/haarcuba/pimped_subprocess
- Owner: haarcuba
- Created: 2017-01-19T00:45:32.000Z (almost 8 years ago)
- Default Branch: master
- Last Pushed: 2019-03-05T23:25:05.000Z (over 5 years ago)
- Last Synced: 2024-11-08T01:08:59.750Z (12 days ago)
- Topics: death, monitor, subprocess
- Language: Python
- Homepage: https://haarcuba.github.io/pimped_subprocess/
- Size: 28.3 KB
- Stars: 4
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Pimped Subprocess
This is a library of "pimped up" subprocess modules with monitoring capabilities.## Installation
Simple:
$ pip install pimped_subprocess
## Pimped Subprocess
`PimpedSubprocess` allows you to run subprocesses in a similar manner to Python's standard `subprocesses`, except that it allows you to follow the subprocess `stdout` stream line by line.
```python
import pimped_subprocess
import timeclass PrependLineNumber( object ):
def __init__( self ):
self._counter = 0def __call__( self, line ):
self._counter += 1
print( '{:04}:\t{}'.format( self._counter, line ) )prependLineNumber = PrependLineNumber()
p = pimped_subprocess.PimpedSubprocess( 'ls -l', shell = True )# must register to get the lines
p.onOutput( prependLineNumber )# acutally run the subprocess
p.launch()# wait for it to finish
p.process.wait()
time.sleep( 0.1 ) # wait a little extra to finish reading everything
```This code will produce something like this:
0001: total 44
0002: drwxrwxr-x 2 yoav yoav 4096 ינו 19 02:40 dist
0003: drwxrwxr-x 2 yoav yoav 4096 ינו 19 02:52 examples
0004: -rw-rw-r-- 1 yoav yoav 258 ינו 19 02:35 go.py
0005: drwxrwxr-x 2 yoav yoav 4096 ינו 19 02:39 pimped_subprocess
0006: drwxrwxr-x 2 yoav yoav 4096 ינו 18 23:58 pimped_subprocess.egg-info
0007: drwxrwxr-x 7 yoav yoav 4096 ינו 19 00:38 python2
0008: -rw-rw-r-- 1 yoav yoav 230 ינו 19 01:28 Rakefile
0009: -rw-rw-r-- 1 yoav yoav 922 ינו 19 02:54 README.md
0010: -rw-rw-r-- 1 yoav yoav 700 ינו 19 02:40 setup.py
0011: drwxrwxr-x 4 yoav yoav 4096 ינו 19 02:34 test
0012: drwxrwxr-x 2 yoav yoav 4096 ינו 19 01:41 tools## Multiple Output Monitors
You can register multiple output monitors by calling `onOutput` multiple times:
```python
p.onOutput( callable1 )
p.onOutput( callable2 )
p.onOutput( callable3 )
```## Process End Event
You can also register to get notified when the process ends:
```python
def myCallback( token, exitCode ):
print( 'process ended with exit code: {}'.format( exitCode ) )p.onProcessEnd( myCallback, 'some token here' )
```When the process ends, `myCallback` will be called with the token and the process's exit code.
The token's job is to help you distinguish between different processes that use the same callback.## Remote Processes
Check out the [Closer](https://github.com/haarcuba/closer) library for using `PimpedSubprocess` capabilites on remote (via SSH) processes.
## Running the Tests
If you want to run the tests you will need `testix` and `pytest`:
$ pip install testix pytest
You'll also need `rake`, but at least on recent Ubuntu versions - rake is installed by default.
Once you have all these, from the root of the source tree:
$ rake test
you can see what indivitual test suites exist with
$ rake -T
found 3 test files
rake test # run all tests
rake test/test_pimped_subprocess.py # run tests in test/test_pimped_subprocess.py
rake test/test_real_live_processes.py # run tests in test/test_real_live_processes.py
rake test/test_remote.py # run tests in test/test_remote.py## Encodings
The `launch()` function takes an encoding argument, e.g.
```python
p.launch( encoding = 'utf-8' )
```By default it uses the `latin-1` encoding, since this encoding never produces
decoding errors, but you can change it if you like.## Windows Support
This library leans on the `pty` module which seems to be unavailable for Windows. Hence, this is a Unix only library, sorry.