Command Wrapper (make subprocess.Popen() easy)
Project description
Author : Yves-Gwenael Bourhis
==================================================
Wrap a shell comand into a python threaded object.
==================================================
Usage:
======
You want to launch the following bash commands in a thread::
[user@localhost ~] ls -l | grep pdf | wc -l
5
here is how you can do it::
>>> Ls = WrapCommand( 'ls -l')
>>> GrepPdf = WrapCommand( 'grep pdf')
>>> Wc = WrapCommand( 'wc -l')
>>> Wc(GrepPdf(Ls))
'5\n'
Avoid doing this for processes where a large amount of data is piped
between each command.
instead, do it this way::
>>> Ls = WrapCommand( 'ls -l | grep pdf | wc -l', shell=True)
>>> Ls()
'5\n'
Prefer the threaded method instead if this may take a long time and
that you want to perform other tasks in the meanwhile.
You can specify another shell for running commands::
>>> Ls = WrapCommand( 'ls', shell=True, executable='C:/windows/System32/WindowsPowerShell/v1.0/powershell.exe')
>>> print Ls()
Directory : C:\Users\Yves\python_tests
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 27/01/2011 00:14 7006 commandwrapper.py
-a--- 27/01/2011 00:15 7048 commandwrapper.pyc
You can also use Context Management (with_item):
http://docs.python.org/reference/compound_stmts.html#grammar-token-with_item
example::
>>> with WrapCommand( 'ls -l') as Ls:
... with WrapCommand( 'grep pdf') as GrepPdf:
... with WrapCommand( 'wc -l') as Wc:
... Wc.stdin = GrepPdf
... GrepPdf.stdin = Ls
... Wc.start( )
... #Do stuff
... Wc.join()
...
>>> Wc.results
('5\n', '')
You may also simply want to have a subprocess objet::
>>> ls = WrapCommand( 'ls -l')
>>> lscmd = ls.makeCmd()
>>>
the returned object (`lscmd` in the example above) is a standard subprocess.Popen object
WrapOnceCommand is the same as WrapCommand, but the cmd attribute
which is a subprocess.Popen object will be created once and for all
Therefore the run methode (or the object) can only be called once.
The goal it to launch a command in a thread, and to have this
command easily start/stopped from elsewhere.
===============
Release Notes :
===============
Release 0.1:
============
First Version
Release 0.4:
============
Removed the destructor (__del__ method) because of:
+ The Warning here:
http://docs.python.org/reference/datamodel.html#object.__del__
+ Destroyed objects where not automaticaly removed by the
garbage collector as described here:
http://docs.python.org/library/gc.html#gc.garbage
Which could cause memory usage increase.
Release 0.7:
============
Changed author's contact info.
==================================================
Wrap a shell comand into a python threaded object.
==================================================
Usage:
======
You want to launch the following bash commands in a thread::
[user@localhost ~]
5
here is how you can do it::
>>> Ls = WrapCommand( 'ls -l')
>>> GrepPdf = WrapCommand( 'grep pdf')
>>> Wc = WrapCommand( 'wc -l')
>>> Wc(GrepPdf(Ls))
'5\n'
Avoid doing this for processes where a large amount of data is piped
between each command.
instead, do it this way::
>>> Ls = WrapCommand( 'ls -l | grep pdf | wc -l', shell=True)
>>> Ls()
'5\n'
Prefer the threaded method instead if this may take a long time and
that you want to perform other tasks in the meanwhile.
You can specify another shell for running commands::
>>> Ls = WrapCommand( 'ls', shell=True, executable='C:/windows/System32/WindowsPowerShell/v1.0/powershell.exe')
>>> print Ls()
Directory : C:\Users\Yves\python_tests
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 27/01/2011 00:14 7006 commandwrapper.py
-a--- 27/01/2011 00:15 7048 commandwrapper.pyc
You can also use Context Management (with_item):
http://docs.python.org/reference/compound_stmts.html#grammar-token-with_item
example::
>>> with WrapCommand( 'ls -l') as Ls:
... with WrapCommand( 'grep pdf') as GrepPdf:
... with WrapCommand( 'wc -l') as Wc:
... Wc.stdin = GrepPdf
... GrepPdf.stdin = Ls
... Wc.start( )
... #Do stuff
... Wc.join()
...
>>> Wc.results
('5\n', '')
You may also simply want to have a subprocess objet::
>>> ls = WrapCommand( 'ls -l')
>>> lscmd = ls.makeCmd()
>>>
the returned object (`lscmd` in the example above) is a standard subprocess.Popen object
WrapOnceCommand is the same as WrapCommand, but the cmd attribute
which is a subprocess.Popen object will be created once and for all
Therefore the run methode (or the object) can only be called once.
The goal it to launch a command in a thread, and to have this
command easily start/stopped from elsewhere.
===============
Release Notes :
===============
Release 0.1:
============
First Version
Release 0.4:
============
Removed the destructor (__del__ method) because of:
+ The Warning here:
http://docs.python.org/reference/datamodel.html#object.__del__
+ Destroyed objects where not automaticaly removed by the
garbage collector as described here:
http://docs.python.org/library/gc.html#gc.garbage
Which could cause memory usage increase.
Release 0.7:
============
Changed author's contact info.