Skip to content

datalogics-robb/EasyProcess

 
 

Repository files navigation

EasyProcess is an easy to use python subprocess interface.

Links:

Travis Coveralls Latest Version Supported Python versions License Downloads Code Health Documentation

Features:
  • layer on top of subprocess module
  • easy to start, stop programs
  • easy to get standard output/error, return code of programs
  • command can be list or string
  • logging
  • timeout
  • unit-tests
  • cross-platform, development on linux
  • global config file with program aliases
  • 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: 2.6, 2.7, 3.3, 3.4, 3.5
  • Method chaining
Similar projects:

Basic usage

>>> from easyprocess import EasyProcess
>>> EasyProcess('python --version').call().stderr
u'Python 2.6.6'

Installation

General

  • install pip

  • install the program:

    # as root
    pip install EasyProcess
    

Ubuntu 14.04

sudo apt-get install python-pip
sudo pip install EasyProcess

Uninstall

# as root
pip uninstall EasyProcess

Usage

Simple example

Example program:

#-- include('examples/hello.py')--#
from easyprocess import EasyProcess
import sys

s = EasyProcess([sys.executable, '-c', 'print "hello"']).call().stdout
print(s)
#-#

Output:

#-- sh('python -m easyprocess.examples.hello')--#
hello
#-#

General

The command can be a string list or a concatenated string:

#-- include('examples/cmd.py')--#
from easyprocess import EasyProcess

print('-- Run program, wait for it to complete, get stdout (command is string):')
s=EasyProcess('python -c "print 3"').call().stdout
print(s)

print('-- Run program, wait for it to complete, get stdout (command is list):')
s=EasyProcess(['python','-c','print 3']).call().stdout
print(s)

print('-- Run program, wait for it to complete, get stderr:')
s=EasyProcess('python --version').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 second, stop it, get stdout:')
s=EasyProcess('ping localhost').start().sleep(1).stop().stdout
print(s)

#-#

Output:

#-- sh('python -m easyprocess.examples.cmd')--#
-- Run program, wait for it to complete, get stdout (command is string):
3
-- Run program, wait for it to complete, get stdout (command is list):
3
-- Run program, wait for it to complete, get stderr:
Python 2.7.6
-- Run program, wait for it to complete, get return code:
0
-- Run program, wait 1 second, stop it, get stdout:
PING localhost (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.017 ms
64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.034 ms
#-#

Shell commands

Shell commands are not supported.

Warning

echo is a shell command on Windows (there is no echo.exe), but it is a program on Linux

return_code

:attr:`EasyProcess.return_code` is None until :func:`EasyProcess.stop` or :func:`EasyProcess.wait` is called.

With

By using :keyword:`with` statement the process is started and stopped automatically:

from easyprocess import EasyProcess
with EasyProcess('ping 127.0.0.1') as proc: # start()
    # communicate with proc
    pass
# stopped

Equivalent with:

from easyprocess import EasyProcess
proc = EasyProcess('ping 127.0.0.1').start()
try:
    # communicate with proc
    pass
finally:
    proc.stop()

Timeout

This was implemented with "daemon thread".

"The entire Python program exits when only daemon threads are left." http://docs.python.org/library/threading.html:

#-- include('examples/timeout.py')--#
from easyprocess import EasyProcess

s = EasyProcess('ping localhost').call(timeout=2).stdout
print(s)
#-#

Output:

#-- sh('python -m easyprocess.examples.timeout')--#
PING localhost (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.018 ms
64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.037 ms
64 bytes from localhost (127.0.0.1): icmp_seq=3 ttl=64 time=0.025 ms
#-#

Replacing existing functions

Replacing os.system:

retcode = os.system("ls -l")
==>
p = EasyProcess("ls -l").call()
retcode = p.return_code
print p.stdout

Replacing subprocess.call:

retcode = subprocess.call(["ls", "-l"])
==>
p = EasyProcess(["ls", "-l"]).call()
retcode = p.return_code
print p.stdout

About

Easy to use python subprocess interface

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Python 100.0%