[Python-Dev] Request for Pronouncement: PEP 441 - Improving Python ZIP Application Support

Brett Cannon brett at python.org
Wed Feb 25 20:40:03 CET 2015


On Wed, Feb 25, 2015 at 2:33 PM Paul Moore <p.f.moore at gmail.com> wrote:

> On 25 February 2015 at 17:06, Paul Moore <p.f.moore at gmail.com> wrote:
> >> Is the difference between create and copy important?  e.g., is there
> >> anything wrong with
> >>
> >> create_archive(old_archive, output=new_archive) working as well as
> >> create_archive(directory, archive)?
> >
> > Probably not, now. The semantics have converged enough that this might
> > be reasonable. It's how the command line interface works, after all.
> > It would mean that the behaviour would be different depending on the
> > value of the source argument (supplying the main argument and omitting
> > the target are only valid for create), but again that's how the
> > command line works.
> >
> > I'll have a go at implementing this change this evening and see how it
> > plays out.
>
> That worked out pretty well, IMO. The resulting API is a lot cleaner
> (internally, there's not much change, I still have a copy_archive
> function but it's now private). I've included the resulting API
> documentation below. It looks pretty good to me.
>
> Does anyone have any further suggestions or comments, or does this
> look ready to go back to Guido for a second review?
>

+1 from me.

-Brett


>
> Paul
>
> Python API
> ----------
>
> The module defines two convenience functions:
>
>
> .. function:: create_archive(directory, target=None, interpreter=None,
> main=None)
>
>    Create an application archive from *source*.  The source can be any
>    of the following:
>
>    * The name of a directory, in which case a new application archive
>      will be created from the content of that directory.
>    * The name of an existing application archive file, in which case the
>      file is copied to the target.  The file name should include the
>      ``.pyz`` extension, if required.
>    * A file object open for reading in bytes mode.  The content of the
>      file should be an application archive, and the file object is
>      assumed to be positioned at the start of the archive.
>
>    The *target* argument determines where the resulting archive will be
>    written:
>
>    * If it is the name of a file, the archive will be written to that
>      file.
>    * If it is an open file object, the archive will be written to that
>      file object, which must be open for writing in bytes mode.
>    * If the target is omitted (or None), the source must be a directory
>      and the target will be a file with the same name as the source, with
>      a ``.pyz`` extension added.
>
>    The *interpreter* argument specifies the name of the Python
>    interpreter with which the archive will be executed.  It is written as
>    a "shebang" line at the start of the archive.  On POSIX, this will be
>    interpreted by the OS, and on Windows it will be handled by the Python
>    launcher.  Omitting the *interpreter* results in no shebang line being
>    written.  If an interpreter is specified, and the target is a
>    filename, the executable bit of the target file will be set.
>
>    The *main* argument specifies the name of a callable which will be
>    used as the main program for the archive.  It can only be specified if
>    the source is a directory, and the source does not already contain a
>    ``__main__.py`` file.  The *main* argument should take the form
>    "pkg.module:callable" and the archive will be run by importing
>    "pkg.module" and executing the given callable with no arguments.  It
>    is an error to omit *main* if the source is a directory and does not
>    contain a ``__main__.py`` file, as otherwise the resulting archive
>    would not be executable.
>
>    If a file object is specified for *source* or *target*, it is the
>    caller's responsibility to close it after calling create_archive.
>
>    When copying an existing archive, file objects supplied only need
>    ``read`` and ``readline``, or ``write`` methods.  When creating an
>    archive from a directory, if the target is a file object it will be
>    passed to the ``zipfile.ZipFile`` class, and must supply the methods
>    needed by that class.
>
> .. function:: get_interpreter(archive)
>
>    Return the interpreter specified in the ``#!`` line at the start of the
>    archive.  If there is no ``#!`` line, return :const:`None`.
>    The *archive* argument can be a filename or a file-like object open
>    for reading in bytes mode.  It is assumed to be at the start of the
> archive.
> _______________________________________________
> Python-Dev mailing list
> Python-Dev at python.org
> https://mail.python.org/mailman/listinfo/python-dev
> Unsubscribe: https://mail.python.org/mailman/options/python-dev/
> brett%40python.org
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-dev/attachments/20150225/3a7d5880/attachment-0001.html>


More information about the Python-Dev mailing list