piping an email message
Gerhard Häring
gh at ghaering.de
Fri May 16 13:37:34 EDT 2003
Alessio Pace wrote:
> Hi, I am writing a filter for the emails, I need it to pass through stdin
> and then go via stdout.
>
> Would this piece of code be okay to let just pass the message through the
> pipe correctly?
>
> # file 'pipe.py'
> import email
> import sys
>
> def main():
> stdin_message = sys.stdin.read()
> msg = email.message_from_string(stdin_message)
> sys.stdout.write(str(msg))
>
> if __name__ == '__main__':
> main()
The problem with this code is that it needs to read the entire message
into memory. For 90 % of the messages, this should be no problem, but
for the few multi-megabyte messages that you'll probably process, it
will have negative impacts on the system performance.
I'd rather do something like:
#v+
CHUNK_SIZE = 1024
while True:
chunk = sys.stdin.read(CHUNK_SIZE)
if not chunk: break
sys.stdout.write(chunk)
#v-
Now that you know how to do it properly, you can use the relevant
library function in the first place :-)
#v+
import shutil
shutil.copyfileobj(sys.stdin, sys.stdout)
#v-
As you'll read strings, anyway, the explicit conversion to string using
str() in your above code is superfluous, btw.
-- Gerhard
More information about the Python-list
mailing list