The module defines two convenience functions:
-.. function:: create_archive(source, target=None, interpreter=None, main=None)
+.. function:: create_archive(source, target=None, interpreter=None, main=None,
+ include_file=None)
Create an application archive from *source*. The source can be any
of the following:
contain a ``__main__.py`` file, as otherwise the resulting archive
would not be executable.
+ The *include_file* argument specifies a callback function that is passed the
+ relative path to the file in order to determine which files to store when
+ being called against a directory.
+
If a file object is specified for *source* or *target*, it is the
caller's responsibility to close it after calling create_archive.
self.assertIn('foo/', z.namelist())
self.assertIn('bar/', z.namelist())
+ def test_create_archive_with_include_file(self):
+ # Test packing a directory and using include_file to specify which files to include.
+ def skip_pyc_files(file):
+ return '.pyc' not in str(file)
+ source = self.tmpdir / 'source'
+ source.mkdir()
+ (source / '__main__.py').touch()
+ (source / 'test.py').touch()
+ (source / 'test.pyc').touch()
+ target = self.tmpdir / 'source.pyz'
+
+ zipapp.create_archive(source, target, include_file=skip_pyc_files)
+ with zipfile.ZipFile(target, 'r') as z:
+ self.assertIn('__main__.py', z.namelist())
+ self.assertIn('test.py', z.namelist())
+ self.assertNotIn('test.pyc', z.namelist())
+
def test_create_archive_default_target(self):
# Test packing a directory to the default name.
source = self.tmpdir / 'source'
os.chmod(new_archive, os.stat(new_archive).st_mode | stat.S_IEXEC)
-def create_archive(source, target=None, interpreter=None, main=None):
+def create_archive(source, target=None, interpreter=None, main=None,
+ include_file=None):
"""Create an application archive from SOURCE.
The SOURCE can be the name of a directory, or a filename or a file-like
with zipfile.ZipFile(fd, 'w') as z:
for child in source.rglob('*'):
arcname = child.relative_to(source).as_posix()
- z.write(child, arcname)
+ if include_file is None or include_file(pathlib.Path(arcname)):
+ z.write(child, arcname)
if main_py:
z.writestr('__main__.py', main_py.encode('utf-8'))
Anders Qvist
Thomas Rachel
Ram Rachum
+Jeffrey Rackauckas
Jérôme Radix
Burton Radons
Abhilash Raj
--- /dev/null
+Add an ``include_file`` parameter to ``zipapp.create_archive()``