Install and Run Python Applications in Isolated Environments

Overview

pipx — Install and Run Python Applications in Isolated Environments

Test CI PyPI version

Documentation: https://pipxproject.github.io/pipx/

Source Code: https://github.com/pipxproject/pipx

For comparison to other tools including pipsi, see Comparison to Other Tools.

Install pipx

On macOS:

brew install pipx
pipx ensurepath

Upgrade pipx with brew update && brew upgrade pipx.

Otherwise, install via pip:

python3 -m pip install --user pipx
python3 -m pipx ensurepath

Upgrade pipx with python3 -m pip install --user -U pipx.

Shell completions are available by following the instructions printed with this command:

pipx completions

For more details, see the installation instructions.

Overview: What is pipx?

pipx is a tool to help you install and run end-user applications written in Python. It's roughly similar to macOS's brew, JavaScript's npx, and Linux's apt.

It's closely related to pip. In fact, it uses pip, but is focused on installing and managing Python packages that can be run from the command line directly as applications.

How is it Different from pip?

pip is a general-purpose package installer for both libraries and apps with no environment isolation. pipx is made specifically for application installation, as it adds isolation yet still makes the apps available in your shell: pipx creates an isolated environment for each application and its associated packages.

pipx does not ship with pip, but installing it is often an important part of bootstrapping your system.

Where Does pipx Install Apps From?

By default, pipx uses the same package index as pip, PyPI. pipx can also install from all other sources pip can, such as a local directory, wheel, git url, etc.

Python and PyPI allow developers to distribute code with "console script entry points". These entry points let users call into Python code from the command line, effectively acting like standalone applications.

pipx is a tool to install and run any of these thousands of application-containing packages in a safe, convenient, and reliable way. In a way, it turns Python Package Index (PyPI) into a big app store for Python applications. Not all Python packages have entry points, but many do.

If you would like to make your package compatible with pipx, all you need to do is add a console scripts entry point. If you're a poetry user, use these instructions.

Features

pipx enables you to

  • Expose CLI entrypoints of packages ("apps") installed to isolated environments with the install command. This guarantees no dependency conflicts and clean uninstalls!
  • Easily list, upgrade, and uninstall packages that were installed with pipx
  • Run the latest version of a Python application in a temporary environment with the run command

Best of all, pipx runs with regular user permissions, never calling sudo pip install (you aren't doing that, are you? 😄 ).

Walkthrough: Installing a Package and its Applications With pipx

You can globally install an application by running

pipx install PACKAGE

This automatically creates a virtual environment, installs the package, and adds the package's associated applications (entry points) to a location on your PATH. For example, pipx install pycowsay makes the pycowsay command available globally, but sandboxes the pycowsay package in its own virtual environment. pipx never needs to run as sudo to do this.

Example:

>> pipx install pycowsay
  installed package pycowsay 2.0.3, Python 3.7.3
  These apps are now globally available
    - pycowsay
done! ✨ 🌟 ✨


>> pipx list
venvs are in /home/user/.local/pipx/venvs
apps are exposed on your $PATH at /home/user/.local/bin
   package pycowsay 2.0.3, Python 3.7.3
    - pycowsay


# Now you can run pycowsay from anywhere
>> pycowsay mooo
  ____
< mooo >
  ====
         \
          \
            ^__^
            (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

Installing from Source Control

You can also install from a git repository. Here, black is used as an example.

pipx install git+https://github.com/psf/black.git
pipx install git+https://github.com/psf/[email protected]  # branch of your choice
pipx install git+https://github.com/psf/[email protected]  # git hash
pipx install https://github.com/psf/black/archive/18.9b0.zip  # install a release

Walkthrough: Running an Application in a Temporary Virtual Environment

This is an alternative to pipx install.

pipx run downloads and runs the above mentioned Python "apps" in a one-time, temporary environment, leaving your system untouched afterwards.

This can be handy when you need to run the latest version of an app, but don't necessarily want it installed on your computer.

You may want to do this when you are initializing a new project and want to set up the right directory structure, when you want to view the help text of an application, or if you simply want to run an app in a one-off case and leave your system untouched afterwards.

For example, the blog post How to set up a perfect Python project uses pipx run to kickstart a new project with cookiecutter, a tool that creates projects from project templates.

A nice side benefit is that you don't have to remember to upgrade the app since pipx run will automatically run a recent version for you.

Okay, let's see what this looks like in practice!

pipx run APP [ARGS...]

This will install the package in an isolated, temporary directory and invoke the app. Give it a try:

> pipx run pycowsay moo

  ---
< moo >
  ---
   \   ^__^
    \  (oo)\_______
       (__)\       )\/\
           ||----w |
           ||     ||


Notice that you don't need to execute any install commands to run the app.

Any arguments after the application name will be passed directly to the application:

> pipx run pycowsay these arguments are all passed to pycowsay!

  -------------------------------------------
< these arguments are all passed to pycowsay! >
  -------------------------------------------
   \   ^__^
    \  (oo)\_______
       (__)\       )\/\
           ||----w |
           ||     ||

Re-running the same app is quick because pipx caches Virtual Environments on a per-app basis. The caches only last a few days, and when they expire, pipx will again use the latest version of the package. This way you can be sure you're always running a new version of the package without having to manually upgrade.

If the app name does not match that package name, you can use the --spec argument:

pipx run --spec PACKAGE APP

You can also use the --spec argument to run a specific version, or use any other pip-specifier:

pipx run --spec PACKAGE==1.0.0 APP

Running from Source Control

You can also run from a git repository. Here, black is used as an example.

pipx run --spec git+https://github.com/psf/black.git black
pipx run --spec git+https://github.com/psf/[email protected] black  # branch of your choice
pipx run --spec git+https://github.com/psf/[email protected] black  # git hash
pipx run --spec https://github.com/psf/black/archive/18.9b0.zip black # install a release

Running from URL

You can run .py files directly, too.

pipx run https://gist.githubusercontent.com/cs01/fa721a17a326e551ede048c5088f9e0f/raw/6bdfbb6e9c1132b1c38fdd2f195d4a24c540c324/pipx-demo.py
pipx is working!

Summary

That's it! Those are the most important commands pipx offers. To see all of pipx's documentation, run pipx --help or see the docs.

Testimonials

"Thanks for improving the workflow that pipsi has covered in the past. Nicely done!"
Jannis Leidel, PSF fellow, former pip and Django core developer, and founder of the Python Packaging Authority (PyPA)

"My setup pieces together pyenv, poetry, and pipx. [...] For the things I need, it’s perfect."

"I'm a big fan of pipx. I think pipx is super cool."
Michael Kennedy, co-host of PythonBytes podcast in episode 139

Credits

pipx was inspired by pipsi and npx. It was created by Chad Smith and has had lots of help from contributors. The logo was created by @IrishMorales.

pipx is maintained by a team of volunteers (in alphabetical order)

Contributing

Issues and Pull Requests are definitely welcome! Check out Contributing to get started.

Issues
  • Implementation of stored pipx metadata

    Implementation of stored pipx metadata

    This is in reference to Issue #220

    I've implemented a pipxrc file in each venv directory that contains the following:

    • package_or_url - keeping track of the origin of the venv package
    • venv_metadata - keeping track of venv package metadata so uninstall is possible even if the python pointer in the venv bin/ directory is no longer valid
    • injected_packages - keeping track of all injected packages, allowing reinstall to re-inject them all

    I realize that I don't have this in a proper named branch, and the commit log is a bit messy and winding (I spent time figuring out the best way to implement things.) I'm happy to fix all of the above, but I thought it best to submit the code I have to allow for discussion.

    Having a pipxrc really helps a lot! I modified install, uninstall, upgrade, reinstall-all, upgrade-all: all of these commands behave much better, especially with URL-based packages. In this code I also modified reinstall-all to re-inject all injected packages, which fixes Issue #63.

    I also tested reinstall-all with broken symlinks to python inside of the venv, and it works beautifully. This would allow this pull request to fix Issue #146 by allowing reinstall-all to update all the venvs after a system python upgrade. Note: I would recommend that reinstall-all use DEFAULT_PYTHON as the default for the python argument instead of requiring that argument.

    Some outstanding issues:

    • I uncovered a bug by looking at the code (#221). I believe pipxrc can help with this, because it remembers both the injected packages and their inject flags. But I have not addressed this Issue with this pull request
    • I believe that upgrade can drop the '--spec' option now that each venv remembers its own package_or_url, but I didn't code this.
    • I did not handle an exception if pipx is unable to write pipxrc. I was unsure if this was necessary
    • I am not sure exactly whether _run_post_install_actions() affects the venv metadata. If it does, then pipxrc venv_metadata should be updated afterwards. (This is not done in my current pull request)
    opened by itsayellow 64
  • Installing local package fails

    Installing local package fails

    Describe the bug

    pipx fails to install a local package.

    How to reproduce

    pipx install .
    Cannot determine package name from spec '.'. Check package spec for errors.
    
    pipx --version
    0.15.1.3
    

    Expected behavior

    The package should be installed.

    opened by rokroskar 37
  • run app appargs fix for -- double-dash

    run app appargs fix for -- double-dash

    Fixes #267

    This PR allows all arguments after pip run <app_name> to be sent verbatim to the <app_name> app. Currently a -- argument is possible to be removed by argparse before sending the list of arguments to the app.

    The code included in a new parse_args() function doubles a -- argument if it will be removed by argparse. argparse will only remove the first -- in a line, so this ensures that the appargs specified by the user will all be sent to the app.

    opened by itsayellow 35
  • All virtualenvs break when Python version is upgraded

    All virtualenvs break when Python version is upgraded

    I ran

    $ pipx install poetry
    

    just yesterday, and everything worked fine. Then I ran

    $ brew upgrade
    

    which upgraded my system Python from 3.7.2 to 3.7.3. Now pipx no longer works:

    % poetry --version
    zsh: /Users/raxod502/.local/bin/poetry: bad interpreter: /Users/raxod502/.local/pipx/venvs/poetry/bin/python: no such file or directory
    
    % pipx run poetry --version
    ⚠️  poetry is already on your PATH and installed at /Users/raxod502/.local/bin/poetry. Downloading and running anyway.
    Traceback (most recent call last):
      File "/Users/raxod502/.local/bin/pipx", line 10, in <module>
        sys.exit(cli())
      File "/Users/raxod502/.local/lib/python/site-packages/pipx/main.py", line 525, in cli
        exit(run_pipx_command(parsed_pipx_args, binary_args))
      File "/Users/raxod502/.local/lib/python/site-packages/pipx/main.py", line 141, in run_pipx_command
        use_cache,
      File "/Users/raxod502/.local/lib/python/site-packages/pipx/commands.py", line 101, in run
        retval = venv.run_binary(binary, binary_args)
      File "/Users/raxod502/.local/lib/python/site-packages/pipx/Venv.py", line 106, in run_binary
        return _run(cmd, check=False)
      File "/Users/raxod502/.local/lib/python/site-packages/pipx/Venv.py", line 127, in _run
        returncode = subprocess.run(cmd_str_list).returncode
      File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/subprocess.py", line 472, in run
        with Popen(*popenargs, **kwargs) as process:
      File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/subprocess.py", line 775, in __init__
        restore_signals, start_new_session)
      File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/subprocess.py", line 1522, in _execute_child
        raise child_exception_type(errno_num, err_msg, err_filename)
    FileNotFoundError: [Errno 2] No such file or directory: '/Users/raxod502/.local/pipx/.cache/d7fe01e92227b36/bin/poetry': '/Users/raxod502/.local/pipx/.cache/d7fe01e92227b36/bin/poetry'
    
    % pipx upgrade poetry
    Traceback (most recent call last):
      File "/Users/raxod502/.local/bin/pipx", line 10, in <module>
        sys.exit(cli())
      File "/Users/raxod502/.local/lib/python/site-packages/pipx/main.py", line 525, in cli
        exit(run_pipx_command(parsed_pipx_args, binary_args))
      File "/Users/raxod502/.local/lib/python/site-packages/pipx/main.py", line 184, in run_pipx_command
        include_deps=args.include_deps,
      File "/Users/raxod502/.local/lib/python/site-packages/pipx/commands.py", line 213, in upgrade
        old_version = venv.get_venv_metadata_for_package(package).package_version
      File "/Users/raxod502/.local/lib/python/site-packages/pipx/Venv.py", line 74, in get_venv_metadata_for_package
        stdout=subprocess.PIPE,
      File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/subprocess.py", line 472, in run
        with Popen(*popenargs, **kwargs) as process:
      File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/subprocess.py", line 775, in __init__
        restore_signals, start_new_session)
      File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/subprocess.py", line 1522, in _execute_child
        raise child_exception_type(errno_num, err_msg, err_filename)
    FileNotFoundError: [Errno 2] No such file or directory: '/Users/raxod502/.local/pipx/venvs/poetry/bin/python': '/Users/raxod502/.local/pipx/venvs/poetry/bin/python'
    
    % pipx list
    venvs are in /Users/raxod502/.local/pipx/venvs
    binaries are exposed on your $PATH at /Users/raxod502/.local/bin
    multiprocessing.pool.RemoteTraceback:
    """
    Traceback (most recent call last):
      File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/multiprocessing/pool.py", line 121, in worker
        result = (True, func(*args, **kwds))
      File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/multiprocessing/pool.py", line 44, in mapstar
        return list(map(*args))
      File "/Users/raxod502/.local/lib/python/site-packages/pipx/commands.py", line 538, in _get_package_summary
        metadata = venv.get_venv_metadata_for_package(package)
      File "/Users/raxod502/.local/lib/python/site-packages/pipx/Venv.py", line 74, in get_venv_metadata_for_package
        stdout=subprocess.PIPE,
      File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/subprocess.py", line 472, in run
        with Popen(*popenargs, **kwargs) as process:
      File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/subprocess.py", line 775, in __init__
        restore_signals, start_new_session)
      File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/subprocess.py", line 1522, in _execute_child
        raise child_exception_type(errno_num, err_msg, err_filename)
    FileNotFoundError: [Errno 2] No such file or directory: '/Users/raxod502/.local/pipx/venvs/poetry/bin/python': '/Users/raxod502/.local/pipx/venvs/poetry/bin/python'
    """
    
    The above exception was the direct cause of the following exception:
    
    Traceback (most recent call last):
      File "/Users/raxod502/.local/bin/pipx", line 10, in <module>
        sys.exit(cli())
      File "/Users/raxod502/.local/lib/python/site-packages/pipx/main.py", line 525, in cli
        exit(run_pipx_command(parsed_pipx_args, binary_args))
      File "/Users/raxod502/.local/lib/python/site-packages/pipx/main.py", line 187, in run_pipx_command
        commands.list_packages(PIPX_LOCAL_VENVS)
      File "/Users/raxod502/.local/lib/python/site-packages/pipx/commands.py", line 599, in list_packages
        for package_summary in p.map(_get_package_summary, dirs):
      File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/multiprocessing/pool.py", line 268, in map
        return self._map_async(func, iterable, mapstar, chunksize).get()
      File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/multiprocessing/pool.py", line 657, in get
        raise self._value
    FileNotFoundError: [Errno 2] No such file or directory: '/Users/raxod502/.local/pipx/venvs/poetry/bin/python': '/Users/raxod502/.local/pipx/venvs/poetry/bin/python'
    
    % pipx install poetry
    'poetry' already seems to be installed. Not modifying existing installation in '/Users/raxod502/.local/pipx/venvs/poetry'. Pass '--force' to force installation
    
    % pipx install poetry --force
    Installing to existing directory '/Users/raxod502/.local/pipx/venvs/poetry'
    Error: [Errno 2] No such file or directory: '/Users/raxod502/.local/pipx/venvs/poetry/bin/python3.7': '/Users/raxod502/.local/pipx/venvs/poetry/bin/python3.7'
    '/usr/local/opt/python/bin/python3.7 -m venv /Users/raxod502/.local/pipx/venvs/poetry' failed
    
    % pipx reinstall-all python3
    Traceback (most recent call last):
      File "/Users/raxod502/.local/bin/pipx", line 10, in <module>
        sys.exit(cli())
      File "/Users/raxod502/.local/lib/python/site-packages/pipx/main.py", line 516, in cli
        exit(run_pipx_command(parsed_pipx_args, binary_args))
      File "/Users/raxod502/.local/lib/python/site-packages/pipx/main.py", line 209, in run_pipx_command
        skip=args.skip,
      File "/Users/raxod502/.local/lib/python/site-packages/pipx/commands.py", line 467, in reinstall_all
        uninstall(venv_dir, package, local_bin_dir, verbose)
      File "/Users/raxod502/.local/lib/python/site-packages/pipx/commands.py", line 426, in uninstall
        metadata = venv.get_venv_metadata_for_package(package)
      File "/Users/raxod502/.local/lib/python/site-packages/pipx/Venv.py", line 85, in get_venv_metadata_for_package
        stdout=subprocess.PIPE,
      File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/subprocess.py", line 472, in run
        with Popen(*popenargs, **kwargs) as process:
      File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/subprocess.py", line 775, in __init__
        restore_signals, start_new_session)
      File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/subprocess.py", line 1522, in _execute_child
        raise child_exception_type(errno_num, err_msg, err_filename)
    FileNotFoundError: [Errno 2] No such file or directory: '/Users/raxod502/.local/pipx/venvs/poetry/bin/python': '/Users/raxod502/.local/pipx/venvs/poetry/bin/python'
    
    % pipx uninstall-all
    Traceback (most recent call last):
      File "/Users/raxod502/.local/bin/pipx", line 10, in <module>
        sys.exit(cli())
      File "/Users/raxod502/.local/lib/python/site-packages/pipx/main.py", line 516, in cli
        exit(run_pipx_command(parsed_pipx_args, binary_args))
      File "/Users/raxod502/.local/lib/python/site-packages/pipx/main.py", line 191, in run_pipx_command
        commands.uninstall_all(PIPX_LOCAL_VENVS, LOCAL_BIN_DIR, verbose)
      File "/Users/raxod502/.local/lib/python/site-packages/pipx/commands.py", line 449, in uninstall_all
        uninstall(venv_dir, package, local_bin_dir, verbose)
      File "/Users/raxod502/.local/lib/python/site-packages/pipx/commands.py", line 426, in uninstall
        metadata = venv.get_venv_metadata_for_package(package)
      File "/Users/raxod502/.local/lib/python/site-packages/pipx/Venv.py", line 85, in get_venv_metadata_for_package
        stdout=subprocess.PIPE,
      File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/subprocess.py", line 472, in run
        with Popen(*popenargs, **kwargs) as process:
      File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/subprocess.py", line 775, in __init__
        restore_signals, start_new_session)
      File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/subprocess.py", line 1522, in _execute_child
        raise child_exception_type(errno_num, err_msg, err_filename)
    FileNotFoundError: [Errno 2] No such file or directory: '/Users/raxod502/.local/pipx/venvs/poetry/bin/python': '/Users/raxod502/.local/pipx/venvs/poetry/bin/python'
    

    I assume the problem is that when pipx creates the virtual environments, it resolves /usr/local/bin/python3 as a symbolic link, which is problematic since the destination of that symlink changes every time Homebrew upgrades Python (thus making the old virtualenv's Python executable no longer work). I have experienced this problem with Pip as well, but presumably pipx could wrap this behavior somehow to make it work, or at least display a useful error message. At the least, it would be nice to have pipx reinstall-all python3 work properly.

    Workaround is something like the following:

    % mv ~/.local/pipx /tmp/pipx
    % ls /tmp/pipx/venvs | xargs -L 1 pipx install
    

    and manually prune any broken symlinks from ~/.local/bin.

    opened by raxod502 35
  • ModuleNotFoundError: No module named 'pip._vendor.six' when running

    ModuleNotFoundError: No module named 'pip._vendor.six' when running "pipx install"

    Describe the bug

    I have installed a new Debian (unstable) system. On one of my installations pipx runs without problems. The newly installed system behaves differently and I do not know where to look.

    How to reproduce

    $ pipx install --verbose youtube-dl
    pipx > (_package_name_from_spec:93): Determined package name: youtube-dl
    pipx > (_package_name_from_spec:94): Package name determined in 0.0s
    pipx > (run_subprocess:112): running /usr/bin/python3 -m venv --without-pip /home/kai/.local/pipx/venvs/youtube-dl
    pipx > (run_subprocess:112): running /home/kai/.local/pipx/venvs/youtube-dl/bin/python -c import sysconfig; print(sysconfig.get_path('purelib'))
    pipx > (run_subprocess:112): running /home/kai/.local/pipx/shared/bin/python -c import sysconfig; print(sysconfig.get_path('purelib'))
    pipx > (run_subprocess:112): running /home/kai/.local/pipx/venvs/youtube-dl/bin/python --version
    pipx > (run_subprocess:112): running /home/kai/.local/pipx/venvs/youtube-dl/bin/python -m pip install youtube-dl
    Traceback (most recent call last):
      File "/usr/lib/python3.8/runpy.py", line 193, in _run_module_as_main
        return _run_code(code, main_globals, None,
      File "/usr/lib/python3.8/runpy.py", line 86, in _run_code
        exec(code, run_globals)
      File "/home/kai/.local/pipx/shared/lib/python3.8/site-packages/pip/__main__.py", line 16, in <module>
        from pip._internal.cli.main import main as _main  # isort:skip # noqa
      File "/home/kai/.local/pipx/shared/lib/python3.8/site-packages/pip/_internal/cli/main.py", line 10, in <module>
        from pip._internal.cli.autocompletion import autocomplete
      File "/home/kai/.local/pipx/shared/lib/python3.8/site-packages/pip/_internal/cli/autocompletion.py", line 9, in <module>
        from pip._internal.cli.main_parser import create_main_parser
      File "/home/kai/.local/pipx/shared/lib/python3.8/site-packages/pip/_internal/cli/main_parser.py", line 7, in <module>
        from pip._internal.cli import cmdoptions
      File "/home/kai/.local/pipx/shared/lib/python3.8/site-packages/pip/_internal/cli/cmdoptions.py", line 24, in <module>
        from pip._internal.exceptions import CommandError
      File "/home/kai/.local/pipx/shared/lib/python3.8/site-packages/pip/_internal/exceptions.py", line 10, in <module>
        from pip._vendor.six import iteritems
    ModuleNotFoundError: No module named 'pip._vendor.six'
    pipx > (install_package:189): '/home/kai/.local/pipx/venvs/youtube-dl/bin/python -m pip install youtube-dl' failed
    
    pipx > (rmdir:18): removing directory /home/kai/.local/pipx/venvs/youtube-dl
    Error installing youtube-dl.
    

    If I run python3 from the command line I can import the module:

    $ python3 -c "import pip._vendor.six"
    $
    

    I have no idea what could be different. I already checked the list of python3-* packages on both systems but that seems to be the same. Any idea what to look for or how to debug the issue?

    Expected behavior

    The package should be installed.

    enhancement 
    opened by kwbr 34
  • Add env var to set DEFAULT_PYTHON (add Pyenv support)

    Add env var to set DEFAULT_PYTHON (add Pyenv support)

    Fixes #113.

    This keeps sys.executable as the default, but will use the PIPX_DEFAULT_PYTHON environment variable, if defined. This mean no change in functionality for any users until they define the variable.

    I'm suggesting the var PIPX_DEFAULT_PYTHON (no PYENV even though the original issue asked for pyenv support), because this approach will work with any python manager, and I think it might be confusing to enshrine one manager in the var name over others.

    Also, it didn't look like the constants are tested, so I didn't update any tests. But let me know if I missed something and I'll be happy to add.

    opened by wren 32
  • Use importlib.metadata

    Use importlib.metadata

    Working on #339, I discovered this use of the deprecated pkg_resources module. This change adds a dependency on importlib_metadata for python 3.7 and earlier and uses the stdlib version on Python 3.8 and later.

    I haven't tested this behavior, so I could use some help validating that it does what's expected.

    opened by jaraco 28
  • Other `pipx list` output formats

    Other `pipx list` output formats

    How would this feature be useful?

    Hopefully this will synthesize (and possibly supersede) Issues #390 and #109. It addresses the reason for PRs #572 and #392.

    This Issue is to track exactly what users are looking for with different pipx list output formats.

    "Import / Export" set of pipx packages case

    In #109, it appears that one primary motivator is the ability to export a file that specifies a set of pipx-installable packages that pipx can then install (possibly on another machine) in the future.

    How many users desire this or would find it useful?

    It would probably best be done by making a file in json format.

    Within this there are some further points for those desiring this functionality:

    Do people consider it desired (or necessary?) to freeze all versions of all dependencies for this to be useful? If so then this might be very difficult, based on my investigation creating test code for this.

    Simply re-creating a pipx environment, and pinning the version of the main package and any injected packages, and any pipx options is very doable. I have a branch of doing this basically working. In this case, the output would be equivalent to what you would end up with on one machine executing pipx reinstall-all. You can be sure the main package and any injected packages will stay with their specified versions, but you cannot be sure that the versions of any dependencies that still satisfy all package requirements will be the same.

    Archive / Documentation case

    In #390 it appears that one motivation is simply a concise version of pipx list for "keeping track" or for archival or documentation purposes.

    How many users desire this or would find it useful?

    Is this type of list output (that is merely more concise) still desired if the "Import / Export" case is available?

    What are the goals of this format? What are the use cases specifically? How would one know if the output of this was "successful"?

    I must confess that I need this one explained to me, it doesn't naturally occur to me what is desired. If all that's needed is documentation of what is currently installed, then the current pipx list seems to cover that. If what is desired is a structured output that would allow one to recreate a pipx environment, then the "Import / Export" json scenario seems to satisfy the need.

    @comkieffer @gvoysey @sanketdg @zachvalenta

    Describe the solution you'd like

    Describe alternatives you've considered

    opened by itsayellow 28
  • Windows support?

    Windows support?

    It's not clear from the docs if pipx supports Windows, but given that it relies on symlinks, I assume not? (Symlinks typically require extra privileges on Windows, that the average user doesn't have). Are there plans to support Windows?

    help wanted 
    opened by pfmoore 26
  • pipx install erroneously exposing binaries of dependencies despite no `--include-deps` switch

    pipx install erroneously exposing binaries of dependencies despite no `--include-deps` switch

    This might already be possible, I couldn't find out how however.

    How would this feature be useful? Currently when installing a package all of it's included apps (dependencies?) are exposed to $PATH, even though when I for instance want to install organize using pipx install organize-tool I really only want the organize binary to be exposed. I assume (with my limited knowledge of python packages) that these apps are actually required for the main app but could also be contained to the venv and don't need to be exposed to $PATH.

    What is actually installed is the following:

       package organize-tool 1.9.1, Python 3.8.5
        - EXIF.py
        - activate-global-python-argcomplete
        - docx2txt
        - dumppdf.py
        - latin2ascii.py
        - organize
        - pdf2txt.py
        - python-argcomplete-check-easy-install-script
        - python-argcomplete-tcsh
        - register-python-argcomplete
        - textract
    

    I looked for a way to do this and thought I might be able to do so by editing the pipx_metadata.json but unfortunately that doesn't seem to be the case.

    Describe the solution you'd like Given that it's probably not practical to determine which of the apps included is the main one it'd probably be better to make this configurable by the user themselves in for instance the pipx_metadata.json

    opened by sandersantema 26
  • Fix typo in `pipx upgrade-all` output

    Fix typo in `pipx upgrade-all` output

    Signed-off-by: Maxwell G [email protected]

    • [x] I have added an entry to docs/changelog.md

    Summary of changes

    This change is self explanatory; it just fixes a typo.

    Test plan

    Tested by running

    pipx upgrade-all
    
    opened by gotmax23 0
  • Write animation fallback message to stderr

    Write animation fallback message to stderr

    Attempt at fixing #769, although I couldn't get the test test_delay_suppresses_output to pass. Any suggestions would be appreciated!

    Fixes #769.

    • [x] I have added an entry to docs/changelog.md

    Summary of changes

    Test plan

    Tested by running

    # command(s) to exercise these changes
    
    opened by canac 0
  • Upgrading shared libraries messes up JSON output

    Upgrading shared libraries messes up JSON output

    Describe the bug I have a script that parses the output of pipx list --json to list all installed packages. Today, it triggered the upgrading shared libraries logic. The upgrader wrote "upgrading shared libraries..." to stdout, which caused an error when attempting to parse the JSON output.

    How to reproduce Manually set SHARED_LIBS_MAX_AGE_SEC = 0. Then run pipx list --json.

    Expected behavior Stdout should contain valid JSON. Instead it contains upgrading shared libraries...\n{ JSON output... }

    opened by canac 0
  • No apps associated with package ansible

    No apps associated with package ansible

    Hello, just trying to install ansible through pipx like displayed at https://pypa.github.io/pipx/programs-to-try/#ansible

    Tried commands found on closed issues as well:

    pipx install ansible
    No apps associated with package ansible or its dependencies. If you are attempting to install a library, pipx should not be used. Consider using pip or a similar tool instead.
    
    pipx install ansible-base --include-deps
    No apps associated with package ansible-base or its dependencies. If you are attempting to install a library, pipx should not be used. Consider using pip or a similar tool instead.
    
    pipx install ansible --include-deps
    No apps associated with package ansible or its dependencies. If you are attempting to install a library, pipx should not be used. Consider using pip or a similar tool instead.
    

    So.. what's wrong?

    opened by NoxInmortus 2
  • Using pipx list command

    Using pipx list command

    Describe the bug

    How to reproduce

    Expected behavior

    opened by WCHIHO 1
  • Update Workflow badge

    Update Workflow badge

    • [x] I have added an entry to docs/changelog.md

    Summary of changes

    Update the link to the GitHub actions workflow status badge based on the updated docs.

    Considerations

    • I've not used the branch parameter (by appending ?branch=main) to the link since that shows no status:

    • I've not used the test_all_packages_slow.yml workflow file since that is what was originally linked to.

    Test plan

    Tested by running the following commands (in a python virtual environment):

    pip install nox
    nox -s watch_docs
    

    The resultant home page of the docs, published locally, has a working GitHub actions workflow status badge.

    Green arrow points to a working badge.

    Screenshot 2021-11-16 at 15 41 43
    opened by NdagiStanley 0
  • Broken workflow status badge (Local deploy)

    Broken workflow status badge (Local deploy)

    Describe the bug

    The home page of locally published docs has a broken GitHub actions workflow status badge.

    Screenshot 2021-11-16 at 15 40 22

    How to reproduce

    Run the following commands (in a python virtual environment):

    pip install nox
    nox -s watch_docs
    

    The resultant home page of the docs, hosted locally, has a broken GitHub actions workflow status badge.

    Expected behavior

    Green arrow points to a working badge.

    Screenshot 2021-11-16 at 15 41 43
    opened by NdagiStanley 0
  • `master` branch is still being referred to in some files in the repo.

    `master` branch is still being referred to in some files in the repo.

    Describe the bug

    The master branch no longer exists but there are references to it:

    • https://github.com/TechKln/pipx/blob/main/.github/workflows/publish_docs.yml
    • https://github.com/TechKln/pipx/blob/main/docs/comparisons.md#migrating-to-pipx-from-pipsi
    • https://github.com/TechKln/pipx/blob/main/noxfile.py#L86

    Expected behavior

    The references should be to the main branch.

    opened by NdagiStanley 2
  • Update *Edit this page* link

    Update *Edit this page* link

    • [x] I have added an entry to docs/changelog.md

    Summary of changes

    • Updated mkdocs.yml to include

    Reference: MkDocs User guide configuration page

    Test plan

    Tested by running the following in a python virtual environment:

    pip install nox
    nox -s watch_docs
    

    The updated docs can be viewed at http://127.0.0.1:8000/. Click on the pencil icon towards the top right part of the page and confirm that the link redirects to [this page].(https://github.com/pypa/pipx/edit/main/docs/index.md)

    Screenshot 2021-11-16 at 14 16 09
    opened by NdagiStanley 1
  • The *Edit this Page* link in the documentation pages is broken

    The *Edit this Page* link in the documentation pages is broken

    Describe the bug

    The Edit this Page link in the documentation pages at (https://pypa.github.io/pipx/) is broken.

    How to reproduce

    Head to the home page of pipx's documentation (https://pypa.github.io/pipx/), click on the pencil icon towards the top right part of the page and confirm that the link redirects to a 404 page. See below. (I've used green arrows for emphasis)

    Screenshot 2021-11-16 at 14 13 00

    Expected behavior

    Since the repo no longer has master branch, the link should redirect to the main branch instead. See below. (I've used green arrows for emphasis)

    Screenshot 2021-11-16 at 14 16 09
    opened by NdagiStanley 0
Releases(0.16.5)
  • 0.16.3(May 28, 2021)

    • Organization: pipx is extremely pleased to now be a project of the Python Packaging Authority (PyPA)! Note that our github URL has changed to pypa/pipx
    • Fixed pipx list --json to return valid json with no venvs installed. Previously would return an empty string to stdout. (#681)
    • Changed pipx ensurepath bash behavior so that only one of {~/.profile, ~/.bash\_profile} is modified with the extra pipx paths, not both. Previously, if a .bash_profile file was created where one didn't exist, it could cause problems, e.g. #456. The internal change is to use userpath v1.5.0 or greater. (#684)
    • Changed default nox tests, Github Workflow tests, and pytest behavior to use local pypi server with fixed lists of available packages. This allows greater test isolation (no network pypi access needed) and determinism (fixed available dependencies.) It also allows running the tests offline with some extra preparation beforehand (See Running Unit Tests Offline). The old style tests that use the internet to access pypi.org are still available using nox -s tests_internet or pytest --net-pypiserver tests. (#686)
    • Colorama is now only installed on Windows. (#691)
    Source code(tar.gz)
    Source code(zip)
  • 0.16.2.1(Apr 29, 2021)

    • Changed non-venv-info warnings and notices from pipx list to print to stderr. This especially prevents pipx list --json from printing invalid json to stdout. (#680)
    • Fixed bug that could cause uninstall on Windows with injected packages to uninstall too many apps from the local binary directory. (#679)
    Source code(tar.gz)
    Source code(zip)
  • 0.16.2.0(Apr 27, 2021)

    • Fixed bug #670 where uninstalling a venv could erroneously uninstall other apps from the local binary directory. (#672)
    • Added --json switch to pipx list to output rich json-metadata for all venvs.
    • Ensured log files are utf-8 encoded to preven Unicode encoding errors from occurring with emojis. (#646)
    • Fixed issue which made pipx incorrectly list apps as part of a venv when they were not installed by pipx. (#650)
    • Fixed old regression that would prevent pipx uninstall from cleaning up linked binaries if the venv was old and did not have pipx metadata. (#651)
    • Fixed bugs with suffixed-venvs on Windows. Now properly summarizes install, and actually uninstalls associated binaries for suffixed-venvs. (#653)
    • Changed venv minimum python version to 3.6, removing python 3.5 which is End of Life. (#666)
    Source code(tar.gz)
    Source code(zip)
  • 0.16.1.0(Feb 26, 2021)

    • Introduce the pipx.run entry point group as an alternative way to declare an application for pipx run. (#615)
    • Fix cursor show/hide to work with older versions of Windows. (#610)
    • Support text colors on Windows. (#612)
    • Better platform unicode detection to avoid errors and allow showing emojis when possible. (#614)
    • Don't emit show cursor or hide cursor codes if STDERR is not a tty. (#620)
    • Sped up pipx list (#624).
    • pip errors no longer stream to the shell when pip fails during a pipx install. pip's output is now saved to a log file. In the shell, pipx will tell you the location of the log file and attempt to summarize why pip failed. (#625)
    • For reinstall-all, fixed bug where missing python executable would cause error. (#634)
    • Fix regression which prevented pipx from working with pythonloc (and __pypackages__ folder). (#636)
    Source code(tar.gz)
    Source code(zip)
  • 0.16.0.0(Jan 16, 2021)

    • New venv inspection! The code that pipx uses to examine and determine metadata in an installed venv has been made faster, better, and more reliable. It now uses modern python libraries like packaging and importlib.metadata to examine installed venvs. It also now properly handles installed package extras. In addition, some problems pipx has had with certain characters (like periods) in package names should be remedied.
    • Added reinstall command for reinstalling a single venv.
    • Changed pipx run on non-Windows systems to actually replace pipx process with the app process instead of running it as a subprocess. (Now using python's os.exec*)
    • [bugfix] Fixed bug with reinstall-all command when package have been installed using a specifier. Now the initial specifier is used.
    • [bugfix] Override display of PIPX_DEFAULT_PYTHON value when generating web documentation for pipx install #523
    • [bugfix] Wrap help documentation for environment variables.
    • [bugfix] Fixed uninstall crash that could happen on Windows for certain packages
    • [feature] Venv package name arguments now do not have to match exactly as pipx has them stored, but can be specified in any python-package-name-equivalent way. (i.e. case does not matter, and ., -, _ characters are interchangeable.)
    • [change] Venvs with a suffix: A suffix can contain any characters, but for purposes of uniqueness, python package name rules apply--upper- and lower-case letters are equivalent, and any number of ., -, or _ characters in a row are equivalent. (e.g. if you have a suffixed venv pylint_1.0A you could not add another suffixed venv called pylint--1-0a, as it would not be a unique name.)
    • [implementation detail] Pipx shared libraries (providing pip, setuptools, wheel to pipx) are no longer installed using pip arguments taken from the last regular pipx install. If you need to apply pip arguments to pipx's use of pip for its internal shared libraries, use PIP_* environment variables.
    • [feature] Autocomplete for venv names is no longer restricted to an exact match to the literal venv name, but will autocomplete any logically-similar python package name (i.e. case does not matter, and ., -, _ characters are all equivalent.)
    • pipx now reinstalls its internal shared libraries when the user executes reinstall-all.
    • Made sure shell exit codes from every pipx command are correct. In the past some (like from pipx upgrade) were wrong. The exit code from pipx runpip is now the exit code from the pip command run. The exit code from pipx list will be 1 if one or more venvs have problems that need to be addressed.
    • pipx now writes a log file for each pipx command executed to $PIPX_HOME/logs, typically ~/.local/pipx/logs. pipx keeps the most recent 10 logs and deletes others.
    • pipx upgrade and pipx upgrade-all now have a --upgrade-injected option which directs pipx to also upgrade injected packages.
    • pipx list now detects, identifies, and suggests a remedy for venvs with old-internal data (internal venv names) that need to be updated.
    • Added a "Troubleshooting" page to the pipx web documentation for common problems pipx users may encounter.
    • pipx error, warning, and other messages now word-wrap so words are not split across lines. Their appearance is also now more consistent.
    Source code(tar.gz)
    Source code(zip)
  • 0.15.6.0(Oct 17, 2020)

    • [docs] Update license
    • [bugfix] Fixed regression in list, inject, upgrade, reinstall-all commands when suffixed packages are used.
    • [bugfix] Do not reset package url during upgrade when main package is pipx
    • Updated help text to show description for ensurepath and completions help
    • Added support for user-defined default python interpreter via new PIPX_DEFAULT_PYTHON. Helpful for use with pyenv among other uses.
    • [bugfix] Fixed bug where extras were ignored with a PEP 508 package specification with a URL.
    Source code(tar.gz)
    Source code(zip)
  • 0.15.5.1(Aug 27, 2020)

  • 0.15.5.0(Aug 22, 2020)

    • [feature] Version of each injected package is now listed after name for pipx list --include-injected
    • [feature] --suffix option for install to allow multiple versions of same tool to be installed (#445)
    • [feature] ensurepath now also ensures that pip user binary path containing pipx itself is in user's PATH if pipx was installed using pip install --user.
    • Change metadata recorded from version-specified app install to allow upgrades in future. Adds pipx dependency on packaging package.
    • pipx now parses package specification before install. It removes (with warning) the --editable install option for any package specification that is not a local path. It also removes (with warning) any environment markers.
    • Disabled animation when we cannot determine terminal size or if the number of columns is too small. (Fixes #444)
    • [bugfix] Prevent python error in case where package has no pipx metadata and advise user how to fix.
    • [bugfix] For pipx install, fixed failure to install if user has PIP_USER=1 or user=true in pip.conf. (#110)
    • [bugfix] Requiring userpath v1.4.1 or later so ensure Windows bug is fixed for ensurepath (#437)
    • [feature] pipx logs its own version in verbose mode (#423)
    Source code(tar.gz)
    Source code(zip)
  • 0.15.4.0(May 27, 2020)

  • 0.15.3.1(May 18, 2020)

  • 0.15.1.3(Jan 21, 2020)

    Fix Windows bug to ensure accurate app installation and reporting. Fix bug in install in certain situations involving user-specified python executable.

    Source code(tar.gz)
    Source code(zip)
  • 0.15.1.2(Jan 8, 2020)

  • 0.15.1.1(Jan 8, 2020)

  • 0.15.1.0(Jan 7, 2020)

  • 0.15.0.0(Jan 5, 2020)

  • 0.14.0.0(Aug 11, 2019)

  • 0.13.2.2(Aug 3, 2019)

  • 0.13.2.1(Aug 1, 2019)

pip-run - dynamic dependency loader for Python

pip-run provides on-demand temporary package installation for a single interpreter run. It replaces this series of commands (or their Windows equivale

Jason R. Coombs 61 Nov 20, 2021
Python dependency management and packaging made easy.

Poetry: Dependency Management for Python Poetry helps you declare, manage and install dependencies of Python projects, ensuring you have the right sta

Poetry 17.4k Dec 3, 2021
Python PyPi staging server and packaging, testing, release tool

devpi: PyPI server and packaging/testing/release tool This repository contains three packages comprising the core devpi system on the server and clien

null 506 Nov 24, 2021
Python dependency management and packaging made easy.

Poetry: Dependency Management for Python Poetry helps you declare, manage and install dependencies of Python projects, ensuring you have the right sta

Poetry 17.3k Dec 2, 2021
An installation and dependency system for Python

Pyflow Simple is better than complex - The Zen of Python Pyflow streamlines working with Python projects and files. It's an easy-to-use CLI app with a

David O'Connor 943 Dec 3, 2021
A set of tools to keep your pinned Python dependencies fresh.

pip-tools = pip-compile + pip-sync A set of command line tools to help you keep your pip-based packages fresh, even when you've pinned them. You do pi

Jazzband 5.3k Dec 2, 2021
A PyPI mirror client according to PEP 381 http://www.python.org/dev/peps/pep-0381/

This is a PyPI mirror client according to PEP 381 + PEP 503 http://www.python.org/dev/peps/pep-0381/. bandersnatch >=4.0 supports Linux, MacOSX + Wind

Python Packaging Authority 272 Nov 30, 2021
The Python Package Index

Warehouse Warehouse is the software that powers PyPI. See our development roadmap, documentation, and architectural overview. Getting Started You can

Python Packaging Authority 2.8k Nov 26, 2021
The Python package installer

pip - The Python Package Installer pip is the package installer for Python. You can use pip to install packages from the Python Package Index and othe

Python Packaging Authority 7.6k Dec 1, 2021
Python Development Workflow for Humans.

Pipenv: Python Development Workflow for Humans [ ~ Dependency Scanning by PyUp.io ~ ] Pipenv is a tool that aims to bring the best of all packaging wo

Python Packaging Authority 22.5k Dec 3, 2021
A PyPI mirror client according to PEP 381 http://www.python.org/dev/peps/pep-0381/

This is a PyPI mirror client according to PEP 381 + PEP 503 http://www.python.org/dev/peps/pep-0381/. bandersnatch >=4.0 supports Linux, MacOSX + Wind

Python Packaging Authority 270 Nov 26, 2021
Simple Library Management made with Python

Installation pip install mysql-connector-python NOTE: You must make a database (library) & and table (books, student) to hold all data. Languange and

SonLyte 10 Oct 21, 2021
PokerFace is a Python package for various poker tools.

PokerFace is a Python package for various poker tools. The following features are present in PokerFace... Types for cards and their componen

Juho Kim 4 Sep 25, 2021
OS-agnostic, system-level binary package manager and ecosystem

Conda is a cross-platform, language-agnostic binary package manager. It is the package manager used by Anaconda installations, but it may be used for

Conda 4.4k Nov 24, 2021
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 374 Nov 23, 2021
OS-agnostic, system-level binary package manager and ecosystem

Conda is a cross-platform, language-agnostic binary package manager. It is the package manager used by Anaconda installations, but it may be used for

Conda 4.4k Nov 26, 2021
Package manager based on libdnf and libsolv. Replaces YUM.

Dandified YUM Dandified YUM (DNF) is the next upcoming major version of YUM. It does package management using RPM, libsolv and hawkey libraries. For m

null 923 Nov 28, 2021
A flexible package manager that supports multiple versions, configurations, platforms, and compilers.

Spack Spack is a multi-platform package manager that builds and installs multiple versions and configurations of software. It works on Linux, macOS, a

Spack 2.4k Nov 24, 2021
Your own movie streaming service. Easy to install, easy to use. Download, manage and watch your favorite movies conveniently from your browser or phone. Install it on your server, access it anywhere and enjoy.

Vigilio Your own movie streaming service. Easy to install, easy to use. Download, manage and watch your favorite movies conveniently from your browser

Tugcan Olgun 129 Nov 24, 2021
This repo contains the official code of our work SAM-SLR which won the CVPR 2021 Challenge on Large Scale Signer Independent Isolated Sign Language Recognition.

Skeleton Aware Multi-modal Sign Language Recognition By Songyao Jiang, Bin Sun, Lichen Wang, Yue Bai, Kunpeng Li and Yun Fu. Smile Lab @ Northeastern

Isen (Songyao Jiang) 65 Nov 24, 2021
Install, run, and update apps without root and only in your home directory

Qube Apps Install, run, and update apps in the private storage of a Qube Building instrutions

Micah Lee 18 Nov 8, 2021
Install, run, and update apps without root and only in your home directory

Qube Apps Install, run, and update apps in the private storage of a Qube. Build and install in Qubes Get the code: git clone https://github.com/micahf

Micah Lee 18 Nov 8, 2021
docker run klaus / pip install klaus — the first Git web viewer that Just Works™.

klaus: a simple, easy-to-set-up Git web viewer that Just Works™. (If it doesn't Just Work for you, please file a bug.) Super easy to set up -- no conf

Jonas Haag 605 Nov 12, 2021
run-js Goal: The Easiest Way to Run JavaScript in Python

run-js Goal: The Easiest Way to Run JavaScript in Python features Stateless Async JS Functions No Intermediary Files Functional Programming CommonJS a

Daniel J. Dufour 7 Sep 26, 2021
Run your jupyter notebooks as a REST API endpoint. This isn't a jupyter server but rather just a way to run your notebooks as a REST API Endpoint.

Jupter Notebook REST API Run your jupyter notebooks as a REST API endpoint. This isn't a jupyter server but rather just a way to run your notebooks as

Invictify 35 Nov 12, 2021
Define and run multi-container applications with Docker

Docker Compose Docker Compose is a tool for running multi-container applications on Docker defined using the Compose file format. A Compose file is us

Docker 24.3k Dec 2, 2021
This is a multi-app executor that it used when we have some different task in a our applications and want to run them at the same time

This is a multi-app executor that it used when we have some different task in a our applications and want to run them at the same time. It uses SQLAlchemy for ORM and Alembic for database migrations.

Majid Iranpour 4 Jun 20, 2021
Ready-to-run Docker images containing Jupyter applications

Jupyter Docker Stacks are a set of ready-to-run Docker images containing Jupyter applications and interactive computing tools.

Project Jupyter 6.4k Dec 3, 2021