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

Str*_*mer 18 python deployment setuptools pep

我正在尝试成为一名优秀的Pythonista,并按照我的计划对PEP 338进行部署.

我也在尝试python setuptools install使用setuptools entry_points{'console_scripts': ... }选项生成可执行脚本.

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

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

setuptools(
...
Run Code Online (Sandbox Code Playgroud)

(1)

entry_points=
       {'console_scripts': ['mypkg=mypkg.__main__'],},
Run Code Online (Sandbox Code Playgroud)

(2)

entry_points=
       {'console_scripts': ['mypkg=mypkg.main'],},
Run Code Online (Sandbox Code Playgroud)

(3)

entry_points=
       {'console_scripts': ['mypkg=python -m mypkg'],},
Run Code Online (Sandbox Code Playgroud)

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

cel*_*cel 21

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

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

考虑这个简单的例子:

script_proj/
??? script_proj
?   ??? __init__.py
?   ??? __main__.py
??? setup.py
Run Code Online (Sandbox Code Playgroud)

和minimalistic setup.py:

from setuptools import setup

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

__main__.py是一个虚拟模块,包含该main方法.

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

if __name__ == "__main__":
    main()
Run Code Online (Sandbox Code Playgroud)

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

  • @rm-rf_,您是否使用了`if __name__ == "__main__":` 来确保仅在将`__main__.py` 作为脚本而不是作为模块调用时才调用main? (2认同)
  • 对于使用“setup.cfg”的用户,请参阅[此答案](/sf/answers/3422387671/)了解如何设置入口点。 (2认同)