Carl Banks wrote:
> On Jan 17, 2:28 pm, John Nagle <[EMAIL PROTECTED]> wrote:

> 
>> It's also necessary to call Pickle's "clear_memo" before each "dump"
>> call, since objects might change between successive "dump" calls.
>> "Unpickle" doesn't have a "clear_memo" function.  It should, because
>> if you keep reusing the "Unpickle" object, the memo dictionary
>> fills up with old objects which can't be garbage collected.
>> This creates a memory leak in long-running programs.
> 
> This is all good to know.  I agree that this is a good use case for a
> clear_memo on a pickle unloader.

        reader = pickle.Unpickler(self.datain)  # set up reader
        ....
        reader.memo = {}                # no memory from cycle to cycle

> 
> 
>> Then, on Windows, there's a CR LF problem. This can be fixed by
>> launching the subprocess with
>>
>>     proc = subprocess.Popen(launchargs,
>>         stdin=subprocess.PIPE, stdout=subprocess.PIPE,
>>         universal_newlines=True)
>>
>> Failure to do this produces the useful error message "Insecure string 
>> pickle".
>> Binary "pickle" protocol modes won't work at all in this situation; 
>> "universal
>> newline" translation is compatible, not transparent.  On Unix/Linux, this
>> just works, but the code isn't portable.
> 
> I would think a better solution would be to use the -u switch to
> launch the subprocess, or the PYTHONUNBUFFERED environment variable if
> you want to invoke the Python script directly.  It opens up stdin and
> stdout in binary, unbuffered mode.

    Ah.  That works.  I wasn't aware that "unbuffered" mode also implied
binary transparency.  I did that, and now cPickle works in both text (0)
and binary (2) protocol modes.  Turned off "Universal Newline" mode.

> Thanks: this was an informative post

    Thanks.  We have this working well now.  After a while, I'll publish
the module, which is called "subprocesscall.py".

                                John Nagle
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to