Search code examples
setuptoolssetup.pypython-packagingpython-poetry

Add bash script as an entrypoint to Python package with Poetry


Is it possible to add bash script as an entrypoint (console script) to Python package via poetry? It looks like it only accepts python files (see code here).

I want entry.sh to be an entry script

#!/usr/bin/env bash
set -e

echo "Running entrypoint"

via setup.py

    entry_points={
        "console_scripts": [
            "entry=entry.sh",
        ],
    },

On the other hand setuptools seems to be supporting shell scripts (see code here).

Is it possible to include shell script into a package and add it to the entrypoints after installing when working with Poetry?

UPD. setuptools does not support that as well (it generates code below)

def importlib_load_entry_point(spec, group, name):
    dist_name, _, _ = spec.partition('==')
    matches = (
        entry_point
        for entry_point in distribution(dist_name).entry_points
        if entry_point.group == group and entry_point.name == name
    )
    return next(matches).load()


globals().setdefault('load_entry_point', importlib_load_entry_point)

Is it design decision? It looks to me that packaging should provide such a feature to deliver complex applications as a single bundle.


Solution

  • So I ended up using this workaround: have my script in place and add it to the bundle via package_data and call it from within Python code which I made as an entrypoint.

    import subprocess
    
    def _run(bash_script):
        return subprocess.call(bash_script, shell=True)
    
    def entrypoint():
        return _run("./scripts/my_entrypoint.sh")
    
    def another_entrypoint_if_needed():
        return _run("./scripts/some_other_script.sh")
    

    and pyproject.toml

    [tool.poetry.scripts]
    entrypoint = 'bash_runner:entrypoint'
    another = 'bash_runner:another_entrypoint_if_needed'
    

    Same works for console_scripts in setup.py file.