How can I use setuptools to generate a console_scripts entry point which calls `python -m mypackage`?
Asked Answered
I

1

32

I am trying to be a good Pythonista and following PEP 338 for my package I plan on deploying.

I am also trying to generate my executable scripts upon python setuptools install using setuptools entry_points{'console_scripts': ... } options.

How can I use entry_points to generate a binary that calls python -m mypackage (and passes *args, **kwargs) ?

Here are a few attempts I have made with no success:

setuptools(
...

(1)

entry_points=
       {'console_scripts': ['mypkg=mypkg.__main__'],},

(2)

entry_points=
       {'console_scripts': ['mypkg=mypkg.main'],},

(3)

entry_points=
       {'console_scripts': ['mypkg=python -m mypkg'],},

Primary resources I have been using:

Invert answered 5/1, 2015 at 16:58 Comment(0)
A
40

How can I use entry_points to generate a binary that calls python -m mypackage (and passes *args, **kwargs) ?

I think this is the wrong way to look at the problem. You don't want your script to call python -m mypackage, but you want the script to have the same entry point as python -m mypackage

Consider this simple example:

script_proj/
├── script_proj
│   ├── __init__.py
│   └── __main__.py
└── setup.py

and the minimalistic setup.py:

from setuptools import setup

setup(
    name="script_proj",
    packages=["script_proj"],
    entry_points = {
        "console_scripts": [
            "myscript = script_proj.__main__:main",
        ]
    }
)

__main__.py is a dummy module and contains the main method.

def main():
    print("Hello world!")

if __name__ == "__main__":
    main()

After installing, you have the executable myscript, which calls the main method in __main__.py. In this package design python -m script_proj also calls the same main method.

Aardwolf answered 5/1, 2015 at 17:57 Comment(6)
This works for me, however when calling myscript, my main() function is called twice. My main function only contains a print("Success!") statement, and I get the output twice.Invert
To add to this, calling python -m script_proj will only produce 1 outputInvert
@rm-rf_, it seems to work for me. myscript prints the same as python -m script_proj only one Hello world!... hmmAardwolf
@rm-rf_, did you use if __name__ == "__main__": to make sure your main is only called, when __main__.pyis called as a script, and not as a module?Aardwolf
Got it! Just needed the if __name__ == "__main__" in main.py. Silly mistake. Thanks so much.Invert
For those using a setup.cfg, see this answer for how to set entry points.Vories

© 2022 - 2024 — McMap. All rights reserved.