py2exe + svn - the final drama
Timothy Smith
timothy at open-networks.net
Fri May 6 20:59:51 EDT 2005
David Bolen wrote:
>Timothy Smith <timothy at open-networks.net> writes:
>
>
>
>>what i do is as soon as the update is complete i close the app, but it
>>still gives the error, i tried clear() after update and before it, it
>>still got the same error. it's be nice to not have to fiddle around
>>with the zip file, i really think making py2exe create a dir instead
>>of a zip will be much better
>>
>>
>
>Well, you'd still potentially have a problem if the update changed a
>file in that directory that hadn't been imported yet, but now depended
>on other updated files that your application had already loaded old
>versions for. That's a general problem of updating modules beneath
>the executing application, and not really specific to the zip file,
>although you're getting a zip importer specific error related to that
>in this case.
>
>
>
>>here what i do anyway
>>
>>if (os.name == 'nt') or (os.name == 'win32'):
>> client = pysvn.Client()
>> #get current revision number
>> CurrentRev = client.info('').revision.number
>> Check = client.update('')
>> sys.path_importer_cache.clear()
>> if Check.number > CurrentRev:
>> self.Popup('Update installed, click ok and restart
>>','Update installed')
>> self.Destroy()
>> else:
>> InfoMsg.Update(3,'No Updates needed')
>>
>>
>
>Ah, it's more devious than I thought. Just pointed out the other
>missing piece in his response.
>
>Apparently there are two levels of caching that you've got to defeat
>if you change the underlying zip:
>
>1. A global file set of file directory cache information for any opened
> zip file (for all files in the zip). This is held in the zipimport
> module global _zip_directory_cache.
>2. Individual file cached information within the zipimporter instance
> that is kept in the path importer cache (sys.path_importer_cache).
> Technically these are just references to the same individual entries
> being held in the dictionary from (1).
>
>So when you cleared out (2), it still found the cached directory at
>the zipimport module level and re-used that information. But if you only
>clear out (1), then the reference in (2) to the directory entries for
>currently imported modules remains and still gets used.
>
>I tried testing this with a small zip file that I first built with normal
>compression on the entries, then imported one from a running interpreter,
>and then rebuilt the zip without compression. I couldn't seem to get the
>precise error you were getting, but doing this gave me a decompression
>error upon an attempted reload of an imported module, since the cached
>information still thought it was compressed.
>
>After clearing both sys.path_importer_cache and
>zipimport._zip_directory_cache, the reload went fine.
>
>It's sort of unfortunate that you have to cheat with the "private"
>cache clearing in this case. It might be worth an enhancement request
>to see if zipimport could know to update itself if the timestamp on
>the zip file changes, but this is sort of a very specialized scenario.
>Although maybe just a public way to cleanly flush import cache
>information would be useful.
>
>-- David
>
>
awesome it looks like it's working now!
it's a very convenient why of keeping them all up today, now instead of
stuffing around making setup packages i can just run my makeexe.bat file
to create the py2exe files, svn commit -m "new package" and i'm done.
also there's no way for the staff to bugger it up ( well, it's fairly safe)
thanks very very much to everyone who made suggestions, this is what
makes OSS so good - the community input and support.
More information about the Python-list
mailing list