Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python: migrate setup.py "scripts=" to entry_points

I'd like to make use of someone else's python utility, foobartools, whose native environment is linux. Foobartools is pure python so there's no reason it can't be used on Windows, where I am.

In their setup.py they're using the older style scripts=['bin/foobar'],.

Running pip install -e b:\code\foobar creates a file called foobar in %pythonhome%\Scripts, but Windows doesn't know about it even though Scripts is in PATH. To use it I need to make a @python %pythonhome%\scripts\foobar batch file. This works but is non-optimal (ctrl-c handling is ugly for instance).

I know that if I add the newer and recommended entry_points syntax to setup.py pip will automatically create Scripts\foobar.exe on Windows (and I can ditch the batch file). On Linux Scripts\foobar remains unchanged, and everybody is happy.

entry_points = {
    'console_scripts': ['foobar = foobartools:main'],
}

I don't know what to do with the right hand side of the equation, foobartools:main. How do make that call bin/foobar? The foobartools module doesn't have a single callable function or module like that corresponds to the bin script, and the bin script is relatively complicated.

I want to make as few changes as possible to the project so that a) a patch submission has a better chance of getting accepted upstream, and b) if upstream remains uninterested there's less work for me to do to keep up with it.

[update] The existing source tree structure:

foobartools/
    bin/foobar
    foobartools/
        __init__.py
        foo/
            __init__.py
            one.py
            two.py
        bar/
            ...
        baz/
            ...
    setup.py
like image 513
matt wilkie Avatar asked May 28 '15 23:05

matt wilkie


1 Answers

I got to a working Scripts\foobar.exe, but it changes more of the code than I wish. I was hoping to get by with just a couple of tweaks to setup.py, or at least something that doesn't mess around inside upstream modules. I don't know it well enough to be sure I'm not getting in the way somehow.

(1) move bin/foobar --> foobartools/foobar_cli.py
(2) In setup.py, comment out #scripts=... and add:

entry_points = {
    'console_scripts': ['foobar = foobartools.foobar_cli:main'],
} 

[later] A refinement of the same core idea, means I keep my fat feet out of the main business area:

(1) move ./bin/foobar --> ./foobar_cli/foobar.py (note extension as well as folder change)
(2) add an empty __init__.py to same folder
(3) console_scripts': ['foobar = foobar_cli.foorbar:main'],

like image 181
matt wilkie Avatar answered Oct 21 '22 05:10

matt wilkie