如何使用setuptools生成一个调用`python -m mypackage`的console_scripts入口点?

我想成为一个优秀的Pythonista,并按照PEP 338为我的计划进行部署.

我也尝试使用setuptools entry_points {‘console_scripts’:…}选项在python setuptools安装时生成我的可执行脚本.

如何使用entry_points生成一个调用python -m mypackage的二进制文件(并传递* args,** kwargs)?

以下是我做过的一些尝试但没有成功:

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'],},

我一直在使用的主要资源:

> http://pythonhosted.org/setuptools/setuptools.html#automatic-script-creation
> https://www.python.org/dev/peps/pep-0338/
> http://www.scotttorborg.com/python-packaging/command-line-scripts.html
> http://blog.habnab.it/blog/2013/07/21/python-packages-and-you/

解决方法:

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

我认为这是查看问题的错误方法.你不希望你的脚本调用python -m mypackage,但你希望脚本与python -m mypackage具有相同的入口点

考虑这个简单的例子:

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

和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是一个虚拟模块,包含main方法.

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

if __name__ == "__main__":
    main()

安装后,你有可执行的myscript,它调用__main__.py中的main方法.
在这个包设计中,python -m script_proj也调用相同的main方法.

上一篇:python – 为什么setup.py在安装之前会扫描命名空间的内容?


下一篇:python – Setuptools无法使用dependency_links中的链接