Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/ponty/EasyProcess
Easy to use python subprocess interface
https://github.com/ponty/EasyProcess
Last synced: about 2 months ago
JSON representation
Easy to use python subprocess interface
- Host: GitHub
- URL: https://github.com/ponty/EasyProcess
- Owner: ponty
- License: bsd-2-clause
- Created: 2011-02-08T09:49:43.000Z (almost 14 years ago)
- Default Branch: master
- Last Pushed: 2023-11-04T19:20:47.000Z (about 1 year ago)
- Last Synced: 2024-11-13T08:06:09.092Z (about 2 months ago)
- Language: Python
- Homepage:
- Size: 584 KB
- Stars: 112
- Watchers: 10
- Forks: 17
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- License: LICENSE.txt
Awesome Lists containing this project
- starred-awesome - EasyProcess - Easy to use python subprocess interface (Python)
README
EasyProcess is a simple easy to use Python subprocess interface.
Links:
* home: https://github.com/ponty/EasyProcess
* PYPI: https://pypi.python.org/pypi/EasyProcess![workflow](https://github.com/ponty/EasyProcess/actions/workflows/main.yml/badge.svg)
Features:
- layer on top of [subprocess](https://docs.python.org/library/subprocess.html) module
- easy to start, stop programs
- easy to get standard output/error, return code of programs
- command can be list (preferred) or string (command string is converted to list using shlex.split)
- logging
- timeout
- shell is not supported
- pipes are not supported
- stdout/stderr is set only after the subprocess has finished
- stop() does not kill whole subprocess tree
- unicode support
- supported python versions: 3.7, 3.8, 3.9, 3.10, 3.11, 3.12
- [Method chaining](https://en.wikipedia.org/wiki/Method_chaining)
Installation:```console
$ python3 -m pip install EasyProcess
```Usage
=====Examples:
```py
# easyprocess/examples/hello.pyfrom easyprocess import EasyProcess
cmd = ["echo", "hello"]
s = EasyProcess(cmd).call().stdout
print(s)```
Output:
```console
$ python3 -m easyprocess.examples.hello
hello
``````py
# easyprocess/examples/cmd.pyimport sys
from easyprocess import EasyProcess
python = sys.executable
print("-- Run program, wait for it to complete, get stdout:")
s = EasyProcess([python, "-c", "print(3)"]).call().stdout
print(s)print("-- Run program, wait for it to complete, get stderr:")
s = EasyProcess([python, "-c", "import sys;sys.stderr.write('4\\n')"]).call().stderr
print(s)print("-- Run program, wait for it to complete, get return code:")
s = EasyProcess([python, "--version"]).call().return_code
print(s)print("-- Run program, wait 1.5 second, stop it, get stdout:")
prog = """
import time
for i in range(10):
print(i, flush=True)
time.sleep(1)
"""
s = EasyProcess([python, "-c", prog]).start().sleep(1.5).stop().stdout
print(s)```
Output:
```console
$ python3 -m easyprocess.examples.cmd
-- Run program, wait for it to complete, get stdout:
3
-- Run program, wait for it to complete, get stderr:
4
-- Run program, wait for it to complete, get return code:
0
-- Run program, wait 1.5 second, stop it, get stdout:
0
1
```Shell commands
--------------Shell commands are not supported.
``echo`` is a shell command on Windows (there is no echo.exe),
but it is a program on Linux.return_code
-----------`EasyProcess.return_code` is None until
`EasyProcess.stop` or `EasyProcess.wait` is called.With
----By using `with` statement the process is started
and stopped automatically:
```python
from easyprocess import EasyProcess
with EasyProcess(["ping", "127.0.0.1"]) as proc: # start()
# communicate with proc
pass
# stopped
```Equivalent:
```python
from easyprocess import EasyProcess
proc = EasyProcess(["ping", "127.0.0.1"]).start()
try:
# communicate with proc
pass
finally:
proc.stop()
```Full example:
```py
# easyprocess/examples/with.pyimport os
import sys
import urllib.request
from os.path import abspath, dirname
from time import sleepfrom easyprocess import EasyProcess
webserver_code = """
from http.server import HTTPServer, CGIHTTPRequestHandler
srv = HTTPServer(server_address=("", 8080), RequestHandlerClass=CGIHTTPRequestHandler)
srv.serve_forever()
"""
os.chdir(dirname(abspath(__file__)))
with EasyProcess([sys.executable, "-c", webserver_code]):
sleep(2) # wait for server
html = urllib.request.urlopen("http://localhost:8080").read().decode("utf-8")
print(html)```
Output:
```console
$ python3 -m easyprocess.examples.withDirectory listing for /
Directory listing for /
```
Timeout
-------
```py
# easyprocess/examples/timeout.py
import sys
from easyprocess import EasyProcess
python = sys.executable
prog = """
import time
for i in range(3):
print(i, flush=True)
time.sleep(1)
"""
print("-- no timeout")
stdout = EasyProcess([python, "-c", prog]).call().stdout
print(stdout)
print("-- timeout=1.5s")
stdout = EasyProcess([python, "-c", prog]).call(timeout=1.5).stdout
print(stdout)
print("-- timeout=50s")
stdout = EasyProcess([python, "-c", prog]).call(timeout=50).stdout
print(stdout)
```
Output:
```console
$ python3 -m easyprocess.examples.timeout
-- no timeout
0
1
2
-- timeout=1.5s
0
1
-- timeout=50s
0
1
2
```