cgi integration question

Gerhard Häring gerhard.haering at opus-gmbh.net
Fri Oct 11 08:54:11 EDT 2002


[Broken Outlook Express quoting manually repaired, setting
textwidth to 65 to help your craps oftware not mess up]

Ken <ken at hotmail.com> [2002-10-11 12:34 GMT]:
> "Gerhard Häring" <gerhard.haering at opus-gmbh.net> wrote:
>> Ken <ken at hotmail.com> [2002-10-11 12:03 GMT]:
>> > [...] I have 2 sets of code. Python is used to display
>> > interface and C++ is used for backend execution. The
>> > executed result is saved to file so the python can read it
>> > and display back on the screen. [...]
>>
>> No need for intermediary files, just use os.popen*.
>>
>> Here's a simple example:
>>
>> >>> import os
>> >>> outf, inf = os.popen2("cat")
>> >>> print >>outf, "hi"
>> >>> outf.close()
>> >>> print inf.read()
>> hi
>>
>> outf is a stream to write to your child process (in this example,
>> the Unix cat utility, which will just duplicate on stdout what it
>> gets on stdin). After writing the "parameters" to cat's stdin, I
>> close it (don't ask me why that's necessary, but this is the way it
>> works :-D). Then, I read the whole output of cat and print it.
> 
> Hi, can you explain what is "inf" and "popen2" in:
> outf, inf = os.popen2("cat")   ?

os.popen2 is a function in the os module. It gets one parameter:
the executable you want to run as a child process. It returns a
tuple of two file objects:

* The first file object is connected to the
  input stream of the child process, i. e. you can WRITE to it.

* The second file object is connected to the output stream of the
  child process, i. e. you can READ from it.

> Is "cat" suppose to be a program name for me to call?

Yeah. As you seem to use Windows (with a b0rken newsreader), you
won't have a 'cat' program. But you will have a 'sort' program,
so you can try the following:

import os
>>> outf, inf = os.popen2("sort")
>>> print >>outf, "Mark"
>>> print >>outf, "Joe"
>>> print >>outf, "Marvin"
>>> outf.close()
>>> lines = inf.readlines()
>>> inf.close()
>>> print lines
['Joe\n', 'Mark\n', 'Marvin\n']

> So.... if I get the idea right, my program should look like this:
> import os
> outf, inf = os.popen2("cat")

# Obviously, replace 'cat' with the path to your compiled C++
# application.

# This send input to the C++ program:

> print >>outf, "hi"

> outf.close()

> print inf.read()  # does this mean  read from file?

Yep.

> and the backend c++ program look somethingl like this:
> executable filename: cat
> 
> #include <iostream>
> using namespace std;
> 
> int main (int argc, char** argv) {
>       cout << "value from argv"<< endl;
>       return 0;
> }
> 
> Still don't get how values are passed to the backend though....can you
> please explain.... : (

In the Python script, you send the paramters to the C++ program
by writing to its stdin. Then, the C++ program does its job, and
when it's ready writes its output on stdout. See above for how to
do the Python script, and here's a simplistic C++ 'backend'
program:

/** 
 * doubler.cc - Reads one line from stdin, then returns the
 * "doubled" string on stdout.
 */

#include <iostream>
#include <string>

using namespace std;

int main(int argc, char** argv) {
    string s;

    cin >> s;

    cout << s + s;

    return 0;
}


Alternatively, you could send over commandline arguments and
parse these in the C++ app.

HTH,

-- Gerhard



More information about the Python-list mailing list