subprocess.Popen howto?

norseman norseman at hughes.net
Thu May 7 17:58:29 EDT 2009


Øystein Johansen (OJOHANS) wrote:
> Hi,
>  
> I have problems understanding the subprocess.Popen object. I have a 
> iterative calculation in a process running and I want to pipe the output 
> (stdout) from this calculation to a Python script.
>  
> Let me include a simple code that simulates the calculating process:
> /* This code simulates a big iterative calculation */
> #include <stdio.h>
> #include <math.h>
>  
> int main()
> {
>  float val[2] = { M_PI, M_E };
>  int i;
>  
>  for ( i = 0; i < 2 i++) {
>   sleep( 15 );   /* It's a hard calculation. It take 15 seconds */
>   printf("Value: %5.6f\n", val[i] );
>   fflush( stdout );
>  }
>  return 0;
> }
>  
> let's compile this to mycalc: gcc -o mycalc calc.c ... (untested code)
>  
> In C I have this code which starts the mycalc process and handles the 
> output from it:
>  
> #include <stdio.h>
> #include <assert.h>
> #define BUF_SIZE 256
>  
> int main()
> {
>  FILE *pip;
>  char line[BUF_SIZE];
>  
>  pip = popen("mycalc", "r");
>  assert( pip != NULL );
>  
>  while ( fgets( line, BUF_SIZE, pip )) {
>   printf( "Hello; I got: %s \n", line );
>   fflush( stdout );
>  }
>  pclose( pip );
>  return 0;
> }
> How can I make such while-loop in Python? I assume I should use 
> subprocess.Popen(), but I can't figure out how?
>  
> -Øystein
>  
>  
> 
> -------------------------------------------------------------------
> The information contained in this message may be CONFIDENTIAL and is
> intended for the addressee only. Any unauthorised use, dissemination of the
> information or copying of this message is prohibited. If you are not the
> addressee, please notify the sender immediately by return e-mail and delete
> this message.
> Thank you.
> 
> 
> ------------------------------------------------------------------------
> 
> --
> http://mail.python.org/mailman/listinfo/python-list
================================

If you don't like a lot of typing that obscures the process,
take a look at os.Popen2  Pg.39 or so in Lib.pdf for 2.5.2
In this case - the popen3 is probably your best bet.

I took a test run on "subprocess" a few months ago. My review:
excessive typing to accomplish the simple.  BlackBox stuff is supposed 
to be short and sweet.

BlackBox was the term applied to drivers and couplers back when.
Back when: one started by writing a subroutine that got used.
            next one got to write a program
            next one got to write an application
            then a BlackBox
            from there one could graduate to OS
That was back when!


to repeat from another of my postings:
                         ---
processPython 2.5.2 (r252:60911, Mar  4 2008, 10:40:55)
[GCC 3.3.6] on linux2
Type "help", "copyright", "credits" or "license" for more information.

 >>> import os
 >>> AbWd = os.spawnlp( os.P_WAIT,"abiword","abiword","")

The P_WAIT stops python until the program (abiword in this case) 
completes.  The "" at the end are for tokens to be given to the program 
and yes - contrary to manual, the program MUST be there TWICE (complete 
with any path needed).

for windows this works:
(for cut and paste from cmd.exe, see:
   Re: Copy & Paste in a Dos box  from norseman  05/06/2009 4:28PM
)

Python 2.5.1 ... on win32
 >>> import os
 >>> result = os.spawnl( os.P_WAIT, "d:\\winmcad\\mcad","")

Runs the program mcad. Returns to python when mcad exits.
                         ---


In your case:  substitute ..."your_compiled_c_program", " >yourPy.py")
                 at the obvious places.

In case this isn't clear;
   method 1:  py1.py starts compiled.c which redirects to yourPy.py
   method 2:  py1.py uses os.popen3(compiled.c...) & the two work it out.
In either case the receiver at the end stays open until completion so 
sleep() things are not needed.  (may need to test for EOL and EOT)

HTH

Steve
norseman at hughes.net



More information about the Python-list mailing list