__ __ __ __ _____ _ _ _____ _ _ _ | \/ | \ \ / / | __ \ (_) | | / ____| | | | | | \ / |_ __\ V / | |__) | __ ___ ____ _| |_ ___ | (___ | |__ ___| | | | |\/| | '__|> < | ___/ '__| \ \ / / _` | __/ _ \ \___ \| '_ \ / _ \ | | | | | | |_ / . \ | | | | | |\ V / (_| | || __/ ____) | | | | __/ | | |_| |_|_(_)_/ \_\ |_| |_| |_| \_/ \__,_|\__\___| |_____/|_| |_|\___V 2.1 if you need WebShell for Seo everyday contact me on Telegram Telegram Address : @jackleetFor_More_Tools:
import contextlib
import os
import pathlib
import shutil
import stat
import sys
import zipfile
__all__ = ['ZipAppError', 'create_archive', 'get_interpreter']
# The __main__.py used if the users specifies "-m module:fn".
# Note that this will always be written as UTF-8 (module and
# function names can be non-ASCII in Python 3).
# We add a coding cookie even though UTF-8 is the default in Python 3
# because the resulting archive may be intended to be run under Python 2.
MAIN_TEMPLATE = """\
# -*- coding: utf-8 -*-
import {module}
{module}.{fn}()
"""
# The Windows launcher defaults to UTF-8 when parsing shebang lines if the
# file has no BOM. So use UTF-8 on Windows.
# On Unix, use the filesystem encoding.
if sys.platform.startswith('win'):
shebang_encoding = 'utf-8'
else:
shebang_encoding = sys.getfilesystemencoding()
class ZipAppError(ValueError):
pass
@contextlib.contextmanager
def _maybe_open(archive, mode):
if isinstance(archive, (str, os.PathLike)):
with open(archive, mode) as f:
yield f
else:
yield archive
def _write_file_prefix(f, interpreter):
"""Write a shebang line."""
if interpreter:
shebang = b'#!' + interpreter.encode(shebang_encoding) + b'\n'
f.write(shebang)
def _copy_archive(archive, new_archive, interpreter=None):
"""Copy an application archive, modifying the shebang line."""
with _maybe_open(archive, 'rb') as src:
# Skip the shebang line from the source.
# Read 2 bytes of the source and check if they are #!.
first_2 = src.read(2)
if first_2 == b'#!':
# Discard the initial 2 bytes and the rest of the shebang line.
first_2 = b''
src.readline()
with _maybe_open(new_archive, 'wb') as dst:
_write_file_prefix(dst, interpreter)
# If there was no shebang, "first_2" contains the first 2 bytes
# of the source file, so write them before copying the rest
# of the file.
dst.write(first_2)
shutil.copyfileobj(src, dst)
if interpreter and isinstance(new_archive, str):
os.chmod(new_archive, os.stat(new_archive).st_mode | stat.S_IEXEC)
def create_archive(source, target=None, interpreter=None, main=None,
filter=None, compressed=False):
"""Create an application archive from SOURCE.
The SOURCE can be the name of a directory, or a filename or a file-like
object referring to an existing archive.
The content of SOURCE is packed into an application archive in TARGET,
which can be a filename or a file-like object. If SOURCE is a directory,
TARGET can be omitted and will default to the name of SOURCE with .pyz
appended.
The created application archive will have a shebang line specifying
that it should run with INTERPRETER (there will be no shebang line if
INTERPRETER is None), and a __main__.py which runs MAIN (if MAIN is
not specified, an existing __main__.py will be used). It is an error
to specify MAIN for anything other than a directory source with no
__main__.py, and it is an error to omit MAIN if the directory has no
__main__.py.
"""
# Are we copying an existing archive?
source_is_file = False
if hasattr(source, 'read') and hasattr(source, 'readline'):
source_is_file = True
else:
source = pathlib.Path(source)
if source.is_file():
source_is_file = True
if source_is_file:
_copy_archive(source, target, interpreter)
return
# We are creating a new archive from a directory.
if not source.exists():
raise ZipAppError("Source does not exist")
has_main = (source / '__main__.py').is_file()
if main and has_main:
raise ZipAppError(
"Cannot specify entry point if the source has __main__.py")
if not (main or has_main):
raise ZipAppError("Archive has no entry point")
main_py = None
if main:
# Check that main has the right format.
mod, sep, fn = main.partition(':')
mod_ok = all(part.isidentifier() for part in mod.split('.'))
fn_ok = all(part.isidentifier() for part in fn.split('.'))
if not (sep == ':' and mod_ok and fn_ok):
raise ZipAppError("Invalid entry point: " + main)
main_py = MAIN_TEMPLATE.format(module=mod, fn=fn)
if target is None:
target = source.with_suffix('.pyz')
elif not hasattr(target, 'write'):
target = pathlib.Path(target)
# Create the list of files to add to the archive now, in case
# the target is being created in the source directory - we
# don't want the target being added to itself
files_to_add = sorted(source.rglob('*'))
# The target cannot be in the list of files to add. If it were, we'd
# end up overwriting the source file and writing the archive into
# itself, which is an error. We therefore check for that case and
# provide a helpful message for the user.
# Note that we only do a simple path equality check. This won't
# catch every case, but it will catch the common case where the
# source is the CWD and the target is a file in the CWD. More
# thorough checks don't provide enough value to justify the extra
# cost.
# If target is a file-like object, it will simply fail to compare
# equal to any of the entries in files_to_add, so there's no need
# to add a special check for that.
if target in files_to_add:
raise ZipAppError(
f"The target archive {target} overwrites one of the source files.")
with _maybe_open(target, 'wb') as fd:
_write_file_prefix(fd, interpreter)
compression = (zipfile.ZIP_DEFLATED if compressed else
zipfile.ZIP_STORED)
with zipfile.ZipFile(fd, 'w', compression=compression) as z:
for child in files_to_add:
arcname = child.relative_to(source)
if filter is None or filter(arcname):
z.write(child, arcname.as_posix())
if main_py:
z.writestr('__main__.py', main_py.encode('utf-8'))
if interpreter and not hasattr(target, 'write'):
target.chmod(target.stat().st_mode | stat.S_IEXEC)
def get_interpreter(archive):
with _maybe_open(archive, 'rb') as f:
if f.read(2) == b'#!':
return f.readline().strip().decode(shebang_encoding)
def main(args=None):
"""Run the zipapp command line interface.
The ARGS parameter lets you specify the argument list directly.
Omitting ARGS (or setting it to None) works as for argparse, using
sys.argv[1:] as the argument list.
"""
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--output', '-o', default=None,
help="The name of the output archive. "
"Required if SOURCE is an archive.")
parser.add_argument('--python', '-p', default=None,
help="The name of the Python interpreter to use "
"(default: no shebang line).")
parser.add_argument('--main', '-m', default=None,
help="The main function of the application "
"(default: use an existing __main__.py).")
parser.add_argument('--compress', '-c', action='store_true',
help="Compress files with the deflate method. "
"Files are stored uncompressed by default.")
parser.add_argument('--info', default=False, action='store_true',
help="Display the interpreter from the archive.")
parser.add_argument('source',
help="Source directory (or existing archive).")
args = parser.parse_args(args)
# Handle `python -m zipapp archive.pyz --info`.
if args.info:
if not os.path.isfile(args.source):
raise SystemExit("Can only get info for an archive file")
interpreter = get_interpreter(args.source)
print("Interpreter: {}".format(interpreter or "<none>"))
sys.exit(0)
if os.path.isfile(args.source):
if args.output is None or (os.path.exists(args.output) and
os.path.samefile(args.source, args.output)):
raise SystemExit("In-place editing of archives is not supported")
if args.main:
raise SystemExit("Cannot change the main function when copying")
create_archive(args.source, args.output,
interpreter=args.python, main=args.main,
compressed=args.compress)
if __name__ == '__main__':
main()
| Name | Type | Size | Permission | Actions |
|---|---|---|---|---|
| __phello__ | Folder | 0755 |
|
|
| __pycache__ | Folder | 0755 |
|
|
| _pyrepl | Folder | 0755 |
|
|
| asyncio | Folder | 0755 |
|
|
| collections | Folder | 0755 |
|
|
| concurrent | Folder | 0755 |
|
|
| config-3.13-x86_64-linux-gnu | Folder | 0755 |
|
|
| ctypes | Folder | 0755 |
|
|
| curses | Folder | 0755 |
|
|
| dbm | Folder | 0755 |
|
|
| Folder | 0755 |
|
||
| encodings | Folder | 0755 |
|
|
| html | Folder | 0755 |
|
|
| http | Folder | 0755 |
|
|
| importlib | Folder | 0755 |
|
|
| json | Folder | 0755 |
|
|
| lib-dynload | Folder | 0755 |
|
|
| logging | Folder | 0755 |
|
|
| multiprocessing | Folder | 0755 |
|
|
| pathlib | Folder | 0755 |
|
|
| pydoc_data | Folder | 0755 |
|
|
| re | Folder | 0755 |
|
|
| sqlite3 | Folder | 0755 |
|
|
| sysconfig | Folder | 0755 |
|
|
| test | Folder | 0755 |
|
|
| tomllib | Folder | 0755 |
|
|
| unittest | Folder | 0755 |
|
|
| urllib | Folder | 0755 |
|
|
| venv | Folder | 0755 |
|
|
| wsgiref | Folder | 0755 |
|
|
| xml | Folder | 0755 |
|
|
| xmlrpc | Folder | 0755 |
|
|
| zipfile | Folder | 0755 |
|
|
| zoneinfo | Folder | 0755 |
|
|
| EXTERNALLY-MANAGED | File | 645 B | 0644 |
|
| LICENSE.txt | File | 13.49 KB | 0644 |
|
| __future__.py | File | 5.1 KB | 0644 |
|
| __hello__.py | File | 227 B | 0644 |
|
| _aix_support.py | File | 3.93 KB | 0644 |
|
| _android_support.py | File | 6.73 KB | 0644 |
|
| _apple_support.py | File | 2.2 KB | 0644 |
|
| _collections_abc.py | File | 31.51 KB | 0644 |
|
| _colorize.py | File | 2.78 KB | 0644 |
|
| _compat_pickle.py | File | 8.53 KB | 0644 |
|
| _compression.py | File | 5.55 KB | 0644 |
|
| _distutils_system_mod.py | File | 5.58 KB | 0644 |
|
| _ios_support.py | File | 2.61 KB | 0644 |
|
| _markupbase.py | File | 14.31 KB | 0644 |
|
| _opcode_metadata.py | File | 9.05 KB | 0644 |
|
| _osx_support.py | File | 21.51 KB | 0644 |
|
| _py_abc.py | File | 6.04 KB | 0644 |
|
| _pydatetime.py | File | 89.83 KB | 0644 |
|
| _pydecimal.py | File | 221.96 KB | 0644 |
|
| _pyio.py | File | 91.1 KB | 0644 |
|
| _pylong.py | File | 11.55 KB | 0644 |
|
| _sitebuiltins.py | File | 3.05 KB | 0644 |
|
| _strptime.py | File | 28.69 KB | 0644 |
|
| _sysconfigdata__linux_x86_64-linux-gnu.py | File | 46.85 KB | 0644 |
|
| _sysconfigdata__x86_64-linux-gnu.py | File | 46.85 KB | 0644 |
|
| _threading_local.py | File | 7.05 KB | 0644 |
|
| _weakrefset.py | File | 5.75 KB | 0644 |
|
| abc.py | File | 6.38 KB | 0644 |
|
| antigravity.py | File | 500 B | 0644 |
|
| argparse.py | File | 99.65 KB | 0644 |
|
| ast.py | File | 63.91 KB | 0644 |
|
| base64.py | File | 21.12 KB | 0755 |
|
| bdb.py | File | 34.51 KB | 0644 |
|
| bisect.py | File | 3.34 KB | 0644 |
|
| bz2.py | File | 11.69 KB | 0644 |
|
| cProfile.py | File | 6.47 KB | 0755 |
|
| calendar.py | File | 25.47 KB | 0644 |
|
| cmd.py | File | 14.96 KB | 0644 |
|
| code.py | File | 12.86 KB | 0644 |
|
| codecs.py | File | 36.06 KB | 0644 |
|
| codeop.py | File | 5.69 KB | 0644 |
|
| colorsys.py | File | 3.97 KB | 0644 |
|
| compileall.py | File | 20.27 KB | 0644 |
|
| configparser.py | File | 52.51 KB | 0644 |
|
| contextlib.py | File | 27.15 KB | 0644 |
|
| contextvars.py | File | 129 B | 0644 |
|
| copy.py | File | 8.76 KB | 0644 |
|
| copyreg.py | File | 7.44 KB | 0644 |
|
| csv.py | File | 18.73 KB | 0644 |
|
| dataclasses.py | File | 63.03 KB | 0644 |
|
| datetime.py | File | 268 B | 0644 |
|
| decimal.py | File | 2.73 KB | 0644 |
|
| difflib.py | File | 81.41 KB | 0644 |
|
| dis.py | File | 40 KB | 0644 |
|
| doctest.py | File | 106.77 KB | 0644 |
|
| enum.py | File | 83.48 KB | 0644 |
|
| filecmp.py | File | 10.4 KB | 0644 |
|
| fileinput.py | File | 15.35 KB | 0644 |
|
| fnmatch.py | File | 6.04 KB | 0644 |
|
| fractions.py | File | 39.08 KB | 0644 |
|
| ftplib.py | File | 33.92 KB | 0644 |
|
| functools.py | File | 38.21 KB | 0644 |
|
| genericpath.py | File | 6.1 KB | 0644 |
|
| getopt.py | File | 7.31 KB | 0644 |
|
| getpass.py | File | 6.09 KB | 0644 |
|
| gettext.py | File | 21.45 KB | 0644 |
|
| glob.py | File | 19.26 KB | 0644 |
|
| graphlib.py | File | 9.42 KB | 0644 |
|
| gzip.py | File | 24.06 KB | 0644 |
|
| hashlib.py | File | 9.13 KB | 0644 |
|
| heapq.py | File | 22.48 KB | 0644 |
|
| hmac.py | File | 7.54 KB | 0644 |
|
| imaplib.py | File | 52.77 KB | 0644 |
|
| inspect.py | File | 124.36 KB | 0644 |
|
| io.py | File | 3.5 KB | 0644 |
|
| ipaddress.py | File | 79.23 KB | 0644 |
|
| keyword.py | File | 1.05 KB | 0644 |
|
| linecache.py | File | 7.11 KB | 0644 |
|
| locale.py | File | 77.13 KB | 0644 |
|
| lzma.py | File | 13.08 KB | 0644 |
|
| mailbox.py | File | 79.73 KB | 0644 |
|
| mimetypes.py | File | 23.29 KB | 0644 |
|
| modulefinder.py | File | 23.23 KB | 0644 |
|
| netrc.py | File | 6.76 KB | 0644 |
|
| ntpath.py | File | 30.12 KB | 0644 |
|
| nturl2path.py | File | 2.32 KB | 0644 |
|
| numbers.py | File | 11.2 KB | 0644 |
|
| opcode.py | File | 2.76 KB | 0644 |
|
| operator.py | File | 10.72 KB | 0644 |
|
| optparse.py | File | 58.95 KB | 0644 |
|
| os.py | File | 40.62 KB | 0644 |
|
| pdb.py | File | 88.79 KB | 0755 |
|
| pickle.py | File | 65.39 KB | 0644 |
|
| pickletools.py | File | 91.85 KB | 0644 |
|
| pkgutil.py | File | 17.85 KB | 0644 |
|
| platform.py | File | 46.24 KB | 0755 |
|
| plistlib.py | File | 29.1 KB | 0644 |
|
| poplib.py | File | 14.26 KB | 0644 |
|
| posixpath.py | File | 17.81 KB | 0644 |
|
| pprint.py | File | 23.59 KB | 0644 |
|
| profile.py | File | 22.6 KB | 0755 |
|
| pstats.py | File | 28.61 KB | 0644 |
|
| pty.py | File | 5.99 KB | 0644 |
|
| py_compile.py | File | 7.65 KB | 0644 |
|
| pyclbr.py | File | 11.13 KB | 0644 |
|
| pydoc.py | File | 107.65 KB | 0755 |
|
| queue.py | File | 13.17 KB | 0644 |
|
| quopri.py | File | 7.01 KB | 0755 |
|
| random.py | File | 36.14 KB | 0644 |
|
| reprlib.py | File | 7.02 KB | 0644 |
|
| rlcompleter.py | File | 7.73 KB | 0644 |
|
| runpy.py | File | 12.58 KB | 0644 |
|
| sched.py | File | 6.2 KB | 0644 |
|
| secrets.py | File | 1.94 KB | 0644 |
|
| selectors.py | File | 19 KB | 0644 |
|
| shelve.py | File | 8.6 KB | 0644 |
|
| shlex.py | File | 13.04 KB | 0644 |
|
| shutil.py | File | 56.12 KB | 0644 |
|
| signal.py | File | 2.44 KB | 0644 |
|
| site.py | File | 25.85 KB | 0644 |
|
| sitecustomize.py | File | 155 B | 0644 |
|
| smtplib.py | File | 42.51 KB | 0755 |
|
| socket.py | File | 36.87 KB | 0644 |
|
| socketserver.py | File | 27.41 KB | 0644 |
|
| sre_compile.py | File | 231 B | 0644 |
|
| sre_constants.py | File | 232 B | 0644 |
|
| sre_parse.py | File | 229 B | 0644 |
|
| ssl.py | File | 51.47 KB | 0644 |
|
| stat.py | File | 6 KB | 0644 |
|
| statistics.py | File | 60.38 KB | 0644 |
|
| string.py | File | 11.51 KB | 0644 |
|
| stringprep.py | File | 12.61 KB | 0644 |
|
| struct.py | File | 257 B | 0644 |
|
| subprocess.py | File | 87.15 KB | 0644 |
|
| symtable.py | File | 13.87 KB | 0644 |
|
| tabnanny.py | File | 11.26 KB | 0755 |
|
| tarfile.py | File | 111.49 KB | 0755 |
|
| tempfile.py | File | 39.15 KB | 0644 |
|
| textwrap.py | File | 19.47 KB | 0644 |
|
| this.py | File | 1003 B | 0644 |
|
| threading.py | File | 53.87 KB | 0644 |
|
| timeit.py | File | 13.15 KB | 0755 |
|
| token.py | File | 2.43 KB | 0644 |
|
| tokenize.py | File | 21.06 KB | 0644 |
|
| trace.py | File | 29.02 KB | 0755 |
|
| traceback.py | File | 64.31 KB | 0644 |
|
| tracemalloc.py | File | 17.62 KB | 0644 |
|
| tty.py | File | 1.99 KB | 0644 |
|
| turtle.py | File | 141.92 KB | 0644 |
|
| types.py | File | 10.94 KB | 0644 |
|
| typing.py | File | 129.61 KB | 0644 |
|
| uuid.py | File | 28.46 KB | 0644 |
|
| warnings.py | File | 26.32 KB | 0644 |
|
| wave.py | File | 22.69 KB | 0644 |
|
| weakref.py | File | 21.01 KB | 0644 |
|
| webbrowser.py | File | 23.71 KB | 0755 |
|
| zipapp.py | File | 8.42 KB | 0644 |
|
| zipimport.py | File | 32.12 KB | 0644 |
|