Upgrading Py2exe App

CM cmpython at gmail.com
Fri Feb 19 23:55:15 EST 2010


On Feb 19, 4:28 pm, Ryan Kelly <r... at rfk.id.au> wrote:
> On Thu, 2010-02-18 at 20:32 -0800, CM wrote:
> > On Feb 18, 7:19 pm, Ryan Kelly <r... at rfk.id.au> wrote:
> > > On Thu, 2010-02-18 at 07:46 -0800, T wrote:
> > > > I have a Python app which I converted to an EXE (all files separate;
> > > > single EXE didn't work properly) via py2exe - I plan on distributing
> > > > this and would like the ability to remotely upgrade the program (for
> > > > example, via HTTP/HTTPS).   Looks like it's not just the EXE that I
> > > > will need need to replace (DLLs, the library.zip, etc.).  What would
> > > > be the best way to go about doing this?
>
> > > I've been working on an auto-update framework for my own frozen apps,
> > > you might find it useful:
>
> > >  http://pypi.python.org/pypi/esky
>
> > This looks pretty interesting and useful.
>
> Thanks :-)
>
> > Just to help me understand it a bit more:  what is it that users will
> > download from some web page in order to initially get the py2exe'd app
> > on their system?  Is it "really" an "esky", with the app's .exe file
> > inside it (but the esky is named the same as the app)?
>
> Currently, it's just a zip file with the frozen app in it, which the
> user unzips to wherever they want the app.  When unzipped it looks like
> this:
>
>    myapp.exe  <-- actually the esky bootstrap exe
>    myapp-X.Y.Z.win32/
>        myapp.exe  <-- the actual frozen app as produced by py2exe
>        python26.dll
>        ...etc...
>
> This could easily be wrapped in an installer - the important thing is
> just that the files end up on the user's machine in the expected
> directory structure.
>
> >   And then when
> > they want to update, the app's code calls the esky class to do the
> > work of swapping out the appropriate .exe file?  Something like this?
>
> Yes.  The idea of having a "bootstrapping exe" is that actual
> application code can be swapped out without having to overwrite the
> executable file.  As long as you don't change python versions, this
> allows updates to be safe against system crashes, even on platforms
> without atomic file replacement.
>
> So the frozen app does this in a background thread:
>
>    Esky(sys.executable,"http://my.updates.com").auto_update()
>
> And it hits the given url, grabs the latest zipfile, downloads and
> unpacks and atomically places it into the application directory.  Et
> viola, your app is at the latest version.
>
> From the packager's point of view, you run the "bdist_esky" distutils
> command to generate the zipfile containing your latest version, then
> simply upload it to your server.
>
> > Would this also work if one used InnoSetup to install the exe on the
> > user's system?
>
> Yes, absolutely - in fact I plan to do this myself at some stage.  All
> that's required is that the files end up in the expected directory
> structure.
>
>    Ryan

Wow, it sounds great.  Good luck with moving forward with it.  I'm not
quite ready to release any apps, but as (if?) I come up on that, and
if I plan on updating them, I would love to make use of Esky.  Thanks
for doing this. :D

Che



More information about the Python-list mailing list