executable archive format

Related tags

Distributionxar
Overview

XAR

CircleCI Status Code style: black Downloads

XAR lets you package many files into a single self-contained executable file. This makes it easy to distribute and install.

A .xar file is a read-only file system image which, when mounted, looks like a regular directory to user-space programs. This requires a one-time installation of a driver for this file system (SquashFS).

XAR is pronounced like "czar" (/t͡ʂar/). The 'X' in XAR is meant to be a placeholder for all other letters as at Facebook this format was originally designed to replace ZIP-based PAR (Python archives), JSAR (JavaScript archives), LAR (Lua archives), and so on.

Use Cases

There are two primary use cases for XAR files. The first is simply collecting a number of files for automatic, atomic mounting somewhere on the filesystem. Using a XAR file vastly shrinks the on-disk size of the data it holds. Compressing to below 20% of the original size is not unheard of. This can save multiple gigabytes per machine and reduce random disk IO. This is especially important on machines with flash storage.

The second use case is an extension of the first -- by making the XAR file executable and using the xarexec helper, a XAR becomes a self-contained package of executable code and its data. A popular example is Python application archives that include all Python source code files, as well as native shared libraries, configuration files, other data.

This can replace virtualenvs and PEX files with a system that is faster, has less overhead, is more compatible, and achieves better compression. The downside is that it requires a setuid helper to perform the mounting.

Advantages of XAR for Python usage

  • SquashFS looks like regular files on disk to Python. This lets it use regular imports which are better supported by CPython.

  • SquashFS looks like regular files to your application, too. You don't need to use pkg_resources or other tricks to access data files in your package.

  • SquashFS with Zstandard compression saves disk space, also compared to a ZIP file.

  • SquashFS doesn't require unpacking of .so files to a temporary location like ZIP files do.

  • SquashFS is faster to start up than unpacking a ZIP file. You only need to mount the file system once. Subsequent calls to your application will reuse the existing mount.

  • SquashFS only decompresses the pages that are used by the application, and decompressed pages are cached in the page cache.

  • SquashFS is read-only so the integrity of your application is guaranteed compared to using virtualenvs or unpacking to a temporary directory.

Benchmarks

Optimizing performance (both space and execution time) was a key design goal for XARs. We ran benchmark tests with open source tools to compare PEX, XAR, and native installs on the following metrics:

  • Size: file size, in bytes, of the executable
  • Cold start time: time taken when we have nothing mounted or extracted
  • Hot start time: time taken when we have extracted cache or mounted XAR squashfs

The PEXs are built with python3 setup.py bdist_pex --bdist-all, and the XARs are built with python3 setup.py bdist_xar --xar-compression-algorithm=zstd.

Console script Size Cold start time Hot start time
django-admin (native) 22851072 B - 0.220 s
django-admin.pex 8529089 B 1.705 s 0.772 s
django-admin.xar 5464064 B (-36%) 0.141 s (-92%) 0.122 s (-84%)
black (native) 1020928 B - 0.245 s
black.pex 677550 B 0.737 s 0.619 s
black.xar 307200 B (-55%) 0.245 s (-67%) 0.219 s (-65%)
jupyter (native) 64197120 B - 0.399 s
jupyter.pex 17315669 B 2.152 s 1.046 s
jupyter.xar 17530880 B (+1%) 0.213 s (-90%) 0.181 s (-83%)

The results show that both file size (with zstd compression) and start times improve with XARs. This is an improvement when shipping to large number of servers, especially with short-running executables, such as small data collection scripts on web servers or interactive command line tools.

Requirements

XAR requires:

  • Linux or macOS
  • Python >= 2.7.11 & >= 3.5
  • squashfs-tools to build XARs
  • squashfuse >= 0.1.102 with squashfuse_ll to run XARs

Components of XAR

bdist_xar

This is a setuptools plugin that lets you package your Python application as a .xar file. It requires squashfs-tools. Install it from PyPI to get the stable version:

pip install xar

or you can install it from this repository:

python setup.py install

After installation go to your favorite Python project with a console script and run:

python setup.py bdist_xar

The setuptools extension bdist_xar has options to configure the XAR, most importantly --interpreter sets the Python interpreter used. Run python setup.py bdist_xar --help for a full list of options.

xarexec_fuse

This is a binary written in C++ used to mount a SquashFS image. It requires squashfuse installed. Note that the current squashfuse package on Ubuntu doesn't include squashfuse_ll, so you will have to install from source.

You can build this part of the code with:

mkdir build && cd build && cmake .. && make && [sudo] make install

Examples

bdist_xar

Simply run:

python /path/to/black/setup.py bdist_xar [--xar-compression-algorithm=zstd]
/path/to/black/dist/black.xar --help

make_xar

XAR provides a simple CLI to create XARs from Python executables or directories. We can create a XAR from an existing Python executable zip file, like a PEX.

make_xar --python black.pex --output black.xar

You can also create a XAR from a directory, and tell XAR which executable to run once it starts.

> mkdir myxar
> echo -n "#\!/bin/sh\nshift\necho \$@" > myxar/echo
> chmod +x myxar/echo
> make_xar --raw myxar --raw-executable echo --output echo
> ./echo hello world
hello world

xarexec_fuse will execute the executable it is given using the XAR path as the first argument, and will forward the XARs arguments after.

Running the Circle CI tests locally

First you need to install docker (and possible docker-machine), as it is how it runs the the code. Then you need to install the circleci cli, and run

circleci build

If you change .circleci/config.yml you should validate it before committing

circleci config validate

Contributing

See the CONTRIBUTING file for how to help out.

License

XAR is BSD-licensed.

Comments
  • Imports of modules in parent directory not working.

    Imports of modules in parent directory not working.

    Lets start with very cool project. Been playing around with it and see lots of cases where I needed this in the past.

    (venv) api goose$ python setup.py install && python setup.py bdist_xar
    
    (venv) api goose$ ./dist/api.xar
    Directories/modules found:  ['ctrl_api', 'setup', 'api', 'compare_api_mappings', 'ctrl_decorators', 'ctrl_logging', 'dev_code', 'endpoints', 'providers', 'settings', 'test_xar', 'tests']
    Traceback (most recent call last):
      File "/mnt/xarfuse/uid-501/5348637a/__run_xar_main__.py", line 32, in <module>
        __invoke_main()
      File "/mnt/xarfuse/uid-501/5348637a/__run_xar_main__.py", line 29, in __invoke_main
        runpy._run_module_as_main(module, False)
      File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/runpy.py", line 193, in _run_module_as_main
        "__main__", mod_spec)
      File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/runpy.py", line 85, in _run_code
        exec(code, run_globals)
      File "/mnt/xarfuse/uid-501/5348637a/ctrl_api/api.py", line 11, in <module>
        from providers.auth.authenticate import (
    ModuleNotFoundError: No module named 'providers'
    

    So what seems to work best is:

    try:
        from providers.auth.authenticate import (
            authenticate,
            retrieve_refresh_token
        )
    except ImportError:
        from .providers.auth.authenticate import (
            authenticate,
            retrieve_refresh_token
        )
    

    Seems relative imports is the default.

    I looked quick and didn't see it mentioned in the docs.

    Perhaps mention the relative imports of this is the expected behaviour?

    opened by c-goosen 9
  • bdist_xar in a pipenv

    bdist_xar in a pipenv

    trying out the xar distutils extension, but having trouble getting it running w/in pipenv

    basically don't see the bdist_xar extension when running distutils:

    pipenv run python setup.py --help-commands
    Standard commands:
      build            build everything needed to install
      build_py         "build" pure Python modules (copy to build directory)
      build_ext        build C/C++ extensions (compile/link to build directory)
      build_clib       build C/C++ libraries used by Python extensions
      build_scripts    "build" scripts (copy and fixup #! line)
      clean            clean up temporary files from 'build' command
      install          install everything from build directory
      install_lib      install all Python modules (extensions and pure Python)
      install_headers  install C/C++ header files
      install_scripts  install scripts (Python or otherwise)
      install_data     install data files
      sdist            create a source distribution (tarball, zip file, etc.)
      register         register the distribution with the Python package index
      bdist            create a built (binary) distribution
      bdist_dumb       create a "dumb" built distribution
      bdist_rpm        create an RPM distribution
      bdist_wininst    create an executable installer for MS Windows
      check            perform some checks on the package
      upload           upload binary package to PyPI
    
    usage: setup.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
       or: setup.py --help [cmd1 cmd2 ...]
       or: setup.py --help-commands
       or: setup.py cmd --help
    

    on mac and have installed xar via brew per the instructions: https://code.fb.com/data-infrastructure/xars-a-more-efficient-open-source-system-for-self-contained-executables/

    in the pipenv i install the extensions by cloning xar, cding into the directory and:

    pipenv run pip install .
    

    still dont get the extension, but if I import it in my setup.py, it works fine, until the build directory is cleaned:

    from xar.commands.bdist_xar import bdist_xar
    setup(
    ...
        cmdclass={'bdist_xar': bdist_xar},
    ...
    )
    

    then:

    › per python setup.py bdist_xar
    running bdist_xar
    running bdist_wheel
    running build
    running build_py
    creating build
    creating build/lib
    copying collector.py -> build/lib
    removing 'build/bdist.macosx-10.12-x86_64/xar' (and everything under it)
    error: [Errno 2] No such file or directory: 'build/bdist.macosx-10.12-x86_64/xar'
    

    any direction is much appreciated

    opened by nathantsoi 8
  • [xar] Fix CMake build

    [xar] Fix CMake build

    D31507009 moved the logging macros to a different header, but this header wasn't added to CMakeLists. This diff fixes the CMake build.

    Tested with:

    mkdir build; cd build; cmake ..; make
    

    Fixes #49

    CLA Signed 
    opened by wrigby 6
  • Add Logging file to xarlib_srcs

    Add Logging file to xarlib_srcs

    I have a feeling the open source build has been broken (at least for MacOS) since https://github.com/facebookincubator/xar/commit/a4c59465d7550c0e26041114d213076bc9ad49ac

    I was getting a linking error against Logging.h, repro'd with both clang and gcc. Explicitly adding that dependency to the xarlib_srcs set has the binary compiling successfully for me now.

    CLA Signed 
    opened by dusty-phillips 6
  • add a `--force` flag to pass force=True to add_distribution?

    add a `--force` flag to pass force=True to add_distribution?

    Perhaps there is a better fix for this, but packaging selenium, I get existing file errors unless I patch https://github.com/facebookincubator/xar/blob/master/xar/xar_builder.py#L392 to force=True

    e.g.

    -        wheel.install(sys_paths, xar_paths, force=False)
    +        wheel.install(sys_paths, xar_paths, force=True)
    

    Any suggestions or should I look into passing through a --force flag?

    edit: to clarify, packaging an executable with selenium as a dependency.

    opened by nathantsoi 6
  • XAR for CentOs and Windows

    XAR for CentOs and Windows

    Hi ,

    It's a great one. Thanks for making one. I am seeking one help. I want to make XAR for windows and CentOs also. Could you please help me by letting me know how to do the same.

    Thanks & regards, Shashank Singh

    question 
    opened by Shashank0719 5
  • Improve make_xar documentation

    Improve make_xar documentation

    Hi all,

    I've received the error below when executing a xar executable file:

    ./hello
    /dev/shm/uid-1000/8d11d214-ns-4026531840/hello.py: 3: /dev/shm/uid-1000/8d11d214-ns-4026531840/hello.py: Syntax error: "(" unexpected
    

    Executable python script

    cat hellopy/hello.py 
    #!/usr/bin/python
    
    for i in range(100):
        print i
    
    

    Build xar

    make_xar --python-interpreter python3 --raw hellopy --raw-executable hello.py --output hello
    

    Any hint is welcome.

    OS: Ubuntu 16.04 LTS

    opened by trungnq97 5
  • Use XAR in containers without kernel modules

    Use XAR in containers without kernel modules

    When using xar in a docker container, there is an issue with the FUSE driver:

    $ ./test.xar
    fuse: device not found, try 'modprobe fuse' first FATAL /opt/xar/xar/XarExecFuse.cpp:486: squashfuse_ll failed with exit status 1
    
    [1]    46915 abort      ./test.xar
    $ modprobe fuse
    modprobe: ERROR: ../libkmod/libkmod.c:586 kmod_search_moddep() could not open moddep file '/lib/modules/4.9.87-linuxkit-aufs/modules.dep.bin'
    modprobe: FATAL: Module fuse not found in directory /lib/modules/4.9.87-linuxkit-aufs
    

    AFAIK the container environment is responsible for the latter.

    Is there any way to use xar without this kernel module, in order avoid privileged containers or mounting the fuse socket? (Probably really important when using docker containers on windows)

    opened by sauercrowd 4
  • Do you need a setup.py file to use this?

    Do you need a setup.py file to use this?

    I'd like to use Xar to improve the import-time performance of Zulip, but we don't have a setup.py file with a fixed set of executables. Instead, we have a requirements.txt file for our standard virtualenv, and individual command source it and then use it.

    There's only 2-3 entry points that we really care about (e.g. the Django standard manage.py that you mention in your benchmarks is one), so it'd be fine if we need to list the entrypoints, but I can't figure out from your documentation how to create a xar archive for such a command without first creating a setup.py file.

    opened by timabbott 3
  • Support for other Python 3.x versions

    Support for other Python 3.x versions

    I noticed that this package only officially supports Python 2.6 and 3.6; is there a reason you'd expect it to not work on with 3.5/3.7, or have you just not tested it for those?

    question 
    opened by timabbott 3
  • Is xar limited to Python?

    Is xar limited to Python?

    Is xar limited to Python or could it be used for other types of payloads as well? Could it be used as more generic image format for something like AppImage?

    opened by probonopd 3
  • Unable to use xar from a venv

    Unable to use xar from a venv

    Hey, thanks for a cool project— I noted that when I install xar in a venv, it doesn't work:

    $ path/to/my/xar_env/bin/python setup.py bdist_xar
    running bdist_xar
    removing 'build/bdist.linux-x86_64/xar' (and everything under it)
    error: [Errno 2] No such file or directory: 'build/bdist.linux-x86_64/xar'
    

    I see the same result when I source bin/activate in that virtualenv and also if my project is installed into the virtualenv. It only works as expected if I pip3 install xar system-wide (undesirable, especially for many CI setups). Is there something I'm missing here to make this work? Thanks again.


    It is particularly a problem because xar also seems to pick up (and then complain about) system dependency versions even when it has downloaded the correct/newer ones, eg:

    Collecting paramiko-expect
      Using cached paramiko_expect-0.2.8-py2.py3-none-any.whl (11 kB)
      Saved ./build/bdist.linux-x86_64/xar/downloads/paramiko_expect-0.2.8-py2.py3-none-any.whl
    Collecting paramiko>=1.10.1
      File was already downloaded path/to/my/project/build/bdist.linux-x86_64/xar/downloads/paramiko-2.7.1-py2.py3-none-any.whl
    Collecting bcrypt>=3.1.3
      File was already downloaded path/to/my/project/build/bdist.linux-x86_64/xar/downloads/bcrypt-3.1.7-cp34-abi3-manylinux1_x86_64.whl
    Collecting cryptography>=2.5
      File was already downloaded path/to/my/project/build/bdist.linux-x86_64/xar/downloads/cryptography-2.9.2-cp35-abi3-manylinux2010_x86_64.whl
    Collecting pynacl>=1.0.1
      File was already downloaded path/to/my/project/build/bdist.linux-x86_64/xar/downloads/PyNaCl-1.4.0-cp35-abi3-manylinux1_x86_64.whl
    Collecting cffi>=1.1
      File was already downloaded path/to/my/project/build/bdist.linux-x86_64/xar/downloads/cffi-1.14.0-cp35-cp35m-manylinux1_x86_64.whl
    Collecting six>=1.4.1
      File was already downloaded path/to/my/project/build/bdist.linux-x86_64/xar/downloads/six-1.15.0-py2.py3-none-any.whl
    Collecting pycparser
      File was already downloaded path/to/my/project/build/bdist.linux-x86_64/xar/downloads/pycparser-2.20-py2.py3-none-any.whl
    Successfully downloaded paramiko-expect paramiko bcrypt cryptography pynacl cffi six pycparser
    WARNING: You are using pip version 20.0.2; however, version 20.1.1 is available.
    You should consider upgrading via the '/usr/bin/python3 -m pip install --upgrade pip' command.
    removing 'build/bdist.linux-x86_64/xar' (and everything under it)
    Traceback (most recent call last):
      File "setup.py", line 25, in <module>
        'tqdm'
      File "/usr/local/lib/python3.5/dist-packages/setuptools/__init__.py", line 144, in setup
        return distutils.core.setup(**attrs)
      File "/usr/lib/python3.5/distutils/core.py", line 148, in setup
        dist.run_commands()
      File "/usr/lib/python3.5/distutils/dist.py", line 955, in run_commands
        self.run_command(cmd)
      File "/usr/lib/python3.5/distutils/dist.py", line 974, in run_command
        cmd_obj.run()
      File "/usr/local/lib/python3.5/dist-packages/xar/commands/bdist_xar.py", line 231, in run
        deps = self._deps(dist)
      File "/usr/local/lib/python3.5/dist-packages/xar/commands/bdist_xar.py", line 193, in _deps
        requires, extras=extras, installer=self.installer
      File "/usr/local/lib/python3.5/dist-packages/pkg_resources/__init__.py", line 792, in resolve
        raise VersionConflict(dist, req).with_context(dependent_req)
    pkg_resources.ContextualVersionConflict: (cryptography 1.2.3 (/usr/lib/python3/dist-packages), Requirement.parse('cryptography>=2.5'), {'paramiko'})
    

    I don't think any of this would be an issue if xar were used from a clean environment.

    I'm using Ubuntu; I can reproduce this behaviour on both Ubuntu Xenial (Python 3.5) and Ubuntu Focal (Python 3.8).

    opened by mikepurvis 1
  • Customizing squashfuse mount options and Mac OS X

    Customizing squashfuse mount options and Mac OS X

    I've got a Python CLI tool that I'm trying to distribute internally at my company, and xar is really close to a perfect fit. There's just one niggling issue for me, and that's the way OSXFUSE (for obvious reasons) always mounts the squashfs with an icon on the Mac OS Desktop.

    The biggest issue is the name, it ends up being called OSXFUSE Volume 0 (squashfuse_ll) or something similar, which is a little rough. It would be great if we could pass the -o volname= option and either set it to the name of the package, or make it customizable.

    Even better would be if there's a way to hide the volume altogether, but that's probably asking a bit much. I haven't been able to figure out if it's actually possible to hide a OSXFUSE volume at all.

    enhancement 
    opened by philchristensen 2
  • mksquashfs: -force-gid invalid gid or unknown group

    mksquashfs: -force-gid invalid gid or unknown group

    I just ran make_xar --python /usr/lib/python3.7/site-packages/IPython --output ipython.xar on Manjaro Linux (Arch derivative) and got this output:

    make_xar --python /usr/lib/python3.7/site-packages/
    IPython --output ipython.xar                                                                     
    2019-11-12 21:01:04,679 INFO Squashing /tmp/tmpgk_12zc1 to /tmp/tmp4pyijqfo
    mksquashfs: -force-gid invalid gid or unknown group      
    Traceback (most recent call last):                                                               
      File "/home/redacted/.local/bin/make_xar", line 10, in <module>
        sys.exit(main())                                                                             
      File "/home/redacted/.local/lib/python3.7/site-packages/xar/make_xar.py", line 147, in main
        xar.build(opts.output, squashfs_options)                                                     
      File "/home/redacted/.local/lib/python3.7/site-packages/xar/xar_builder.py", line 269, in build
        self._staging, tmp_xar, self._shebang, xar_header, squashfs_options
      File "/home/redacted/.local/lib/python3.7/site-packages/xar/xar_builder.py", line 224, in _build_st
    aging_dir                                                                                        
        xar.go()
      File "/home/redacted/.local/lib/python3.7/site-packages/xar/xar_util.py", line 104, in go
        subprocess.check_call(cmd)
      File "/usr/lib/python3.7/subprocess.py", line 347, in check_call
        raise CalledProcessError(retcode, cmd)
    subprocess.CalledProcessError: Command '['mksquashfs', '/tmp/tmpgk_12zc1', '/tmp/tmp5mqduxu2', '-
    noappend', '-noI', '-noX', '-force-uid', 'nobody', '-force-gid', 'nogroup', '-b', '262144', '-com
    p', 'gzip']' returned non-zero exit status 1.
    
    documentation 
    opened by JeffCarpenter 3
  • Instead of invoking squashfuse_ll link with library

    Instead of invoking squashfuse_ll link with library

    The Ubuntu package contains the libsquashfuse_ll.so dynamic library. It is possible to use it instead of the executable itself for xarexec_fuse. We shouldn't wait for debian to package this binary to move forward.

    question 
    opened by thedrow 15
  • how can I embed python binary to xar

    how can I embed python binary to xar

    want to deploy python apps with xar, but need to include python 3.7 binary to support old centos6. used pex to build to that usage. but xar seems dose not include python binary itself. how can I do that?

    enhancement 
    opened by darjeeling 0
Releases(20.12.2)
Owner
Facebook Incubator
We work hard to contribute our work back to the web, mobile, big data, & infrastructure communities. NB: members must have two-factor auth.
Facebook Incubator
shiv is a command line utility for building fully self contained Python zipapps as outlined in PEP 441, but with all their dependencies included.

shiv shiv is a command line utility for building fully self-contained Python zipapps as outlined in PEP 441, but with all their dependencies included!

LinkedIn 1.5k Dec 28, 2022
Python virtualenvs in Debian packages

dh-virtualenv Contents Overview Presentations, Blogs & Other Resources Using dh-virtualenv How does it work? Running tests Building the package in a D

Spotify 1.5k Dec 16, 2022
A tool used to obfuscate python scripts, bind obfuscated scripts to fixed machine or expire obfuscated scripts.

PyArmor Homepage (中文版网站) Documentation(中文版) PyArmor is a command line tool used to obfuscate python scripts, bind obfuscated scripts to fixed machine

Dashingsoft 1.9k Jan 01, 2023
Create standalone executables from Python scripts, with the same performance and is cross-platform.

About cx_Freeze cx_Freeze creates standalone executables from Python scripts, with the same performance, is cross-platform and should work on any plat

Marcelo Duarte 1k Jan 04, 2023
Anaconda is the OS installer used by Fedora, RHEL, CentOS and other Linux distributions.

Anaconda is the OS installer used by Fedora, RHEL, CentOS and other Linux distributions. Documentation Documentation for the Anaconda install

Red Hat Installer Engineering Team 454 Jan 08, 2023
Core utilities for Python packages

packaging Reusable core utilities for various Python Packaging interoperability specifications. This library provides utilities that implement the int

Python Packaging Authority 451 Jan 04, 2023
A distutils extension to create standalone Windows programs from Python code

py2exe for Python 3 py2exe is a distutils extension which allows to build standalone Windows executable programs (32-bit and 64-bit) from Python scrip

py2exe 526 Jan 04, 2023
WinPython is a portable distribution of the Python programming language for Windows

WinPython tools Copyright © 2012-2013 Pierre Raybaut Copyright © 2014-2019+ The Winpython development team https://github.com/winpython/ Licensed unde

1.5k Jan 04, 2023
A library which implements low-level functions that relate to packaging and distribution of Python

What is it? Distlib is a library which implements low-level functions that relate to packaging and distribution of Python software. It is intended to

Python Packaging Authority 29 Oct 11, 2022
FreezeUI is a python package that creates applications using cx_freeze and GUI by converting .py to .exe .

FreezeUI is a python package use to create cx_Freeze setup files and run them to create applications and msi from python scripts (converts .py to .exe or .msi .

4 Aug 25, 2022
pipx — Install and Run Python Applications in Isolated Environments

Install and Run Python Applications in Isolated Environments

Python Packaging Authority 5.9k Jan 07, 2023
A modern Python application packaging and distribution tool

PyOxidizer PyOxidizer is a utility for producing binaries that embed Python. The over-arching goal of PyOxidizer is to make complex packaging and dist

Gregory Szorc 4.5k Jan 07, 2023
auto packaging for iOS

iOS Auto Packaging iOS自动打包脚本 准备 脚本第一次执行之前 先检查依赖, packaging目录下终端执行 pip3 install -r requirements.txt 运行 cd packaging packaging.py -h help -s scheme

DeeCo 17 Jul 23, 2022
local pypi server (custom packages and auto-mirroring of pypi)

localshop A PyPI server which automatically proxies and mirrors PyPI packages based upon packages requested. It has support for multiple indexes and t

Michael van Tellingen 383 Sep 23, 2022
The Application can convert the .py file into exe for faster transformation and can result to build an app in a single click

PEXEY PEXEY Is a high robust py to exe app made top on pyinstaller this application is for the developer who constantly keep making py to exe apps IMP

Aaris Kazi 11 Dec 15, 2022
Python-easy-pack For Linux/Unix, Changed by laman28

Python-easy-pack For Linux/Unix, Changed by laman28

LMFS 2 Jan 28, 2022
modified py2exe to support unicode paths

modified py2exe to support unicode paths

Subpar is a utility for creating self-contained python executables. It is designed to work well with Bazel.

Subpar Subpar is a utility for creating self-contained python executables. It is designed to work well with Bazel. Status Subpar is currently owned by

Google 550 Dec 27, 2022
tool for creating installers from conda packages

(conda) Constructor Description Constructor is a tool which allows constructing an installer for a collection of conda packages. It solves needed pack

Conda 386 Jan 04, 2023
Python Wheel Obfuscator

pywhlobf obfuscates your wheel distribution by compiling python source file to shared library.

Hunt Zhan 79 Dec 22, 2022