Piping stdout to Python callable
Edward Diener
eldiener at earthlink.net
Wed Aug 18 20:56:50 EDT 2004
Antoon Pardon wrote:
> Op 2004-08-18, Edward Diener schreef <eldiener at earthlink.net>:
>> Antoon Pardon wrote:
>>> Op 2004-08-17, Edward Diener schreef <eldiener at earthlink.net>:
>>>> From within a function in my own module I need to take the output
>>>> from a Python module "A", which is sending data to stdout and which
>>>> can not be changed and which I need to invoke as a top-level
>>>> module, and pipe it into another function in my own module so that
>>>> I can read it from stdin. Is there an easy way to do this ? The
>>>> only way I can presently think to do this is through "system
>>>> python A.py | python MyOwnModule.py", which seems a bit laborious
>>>> having to invoke python.exe itself twice. Any other solution would
>>>> be most welcome.
>>>
>>> What do you mean when you say you need to invoke it as a top-level
>>> module? Do you mean you can't import it at all or that importing it
>>> will startup the process of generating output immediatly?
>>
>> I mean that it has a "if __name__ == '__main__' line and I need to
>> trigger it by calling 'python A.py'.
>
>>>
>>> What bothers you with twice invoking the interpreter?
>>
>> Nothing practically. Just seems inelegant.
>>
>>> In these days
>>> a program that is invoked multiples times will generally be only
>>> loaded once in memory.
>>
>> Shared libraries may be loaded once in memory but python.exe itself
>> gets reloaded each time.
>
> That depends on the O.S. It is possible the O.S. notices that an
> invoked program is already loaded en uses the same code-segment
> in memory for following invocations.
>
>>> Are threads an acceptable alternative? Does your MyOwnModule.py
>>> needs to write to stdout?
>>
>> Threads are acceptable. MyOwnModule.py can do anything, depending on
>> parameters, but the idea is that a certain parameter tells it to
>> read from stdin on the other end of the pipe.
>
> Then I fear there is no other solution. As far as I understand, you
> can't redirect standard output on a per thread basis, (at least not
> in python.) That means that if you redirect stdout of the A.py module
> to go into a pipe, the stdout of MyOwnModule.py will go into the
> same pipe. I don't think you want that.
Just wanted to write that someone else pointed out to me os.popen("python
A.py") and that did work well as an alternative to using os.system(etc.) .
Nonetheless thanks for your help. I mentioned this so that you would know
also know about it yourself if you hadn't encountered it.
More information about the Python-list
mailing list