From: bobnotbob on
I am calling external executable from my python program (using
subprocess). This external program's output is a text file which I
then read and parse. Is there any way to "sandbox" the calling of
this external program so that it writes to a virtual file instead of
the hardcoded text?
From: Lie Ryan on
On 12/12/2009 4:07 AM, bobnotbob wrote:
> I am calling external executable from my python program (using
> subprocess). This external program's output is a text file which I
> then read and parse. Is there any way to "sandbox" the calling of
> this external program so that it writes to a virtual file instead of
> the hardcoded text?

If the program writes its outputs to the stdout, you can redirect the
program's stdout using subprocess, try to find a switch that will tell
it to write to stdout. Otherwise, you're pretty much stuck to using a
real file AFAIK.
From: Grant Edwards on
On 2009-12-11, Lie Ryan <lie.1296(a)gmail.com> wrote:
> On 12/12/2009 4:07 AM, bobnotbob wrote:
>> I am calling external executable from my python program (using
>> subprocess). This external program's output is a text file which I
>> then read and parse. Is there any way to "sandbox" the calling of
>> this external program so that it writes to a virtual file instead of
>> the hardcoded text?
>
> If the program writes its outputs to the stdout, you can
> redirect the program's stdout using subprocess, try to find a
> switch that will tell it to write to stdout. Otherwise, you're
> pretty much stuck to using a real file AFAIK.

Most Unix systems have paths that you can pass to programs
which think they need to write to "files". Accessing those
files actually access already open file descriptors such as
stdin, stdout, and stderr.

On Linux, for example, you can tell the program to write to
/proc/self/fd/1 and that's actually stdout which can then be a
pipe connected to the Python program that invoked the program.

This can be very useful when executing a program which can be
told what file to write to, but who's author was too
narrow-minded to provide the option to send output to stdout.

If you need to get fancy you can create multiple input/output
pipes that are inherited by the child program and then
references as /proc/self/fd/<whatever>.

--
Grant Edwards grante Yow! These PRESERVES should
at be FORCE-FED to PENTAGON
visi.com OFFICIALS!!