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

Posted

技术标签:

【中文标题】如何使用 setuptools 生成调用 `python -m mypackage` 的 console_scripts 入口点?【英文标题】:How can I use setuptools to generate a console_scripts entry point which calls `python -m mypackage`? 【发布时间】:2015-03-03 06:29:50 【问题描述】:

我正在努力成为一名优秀的 Pythonista,并为我计划部署的包关注 PEP 338。

我还尝试使用 setuptools entry_points'console_scripts': ... 选项在 python setuptools install 上生成我的可执行脚本。

如何使用 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/

【问题讨论】:

【参考方案1】:

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

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

考虑这个简单的例子:

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

和简约的 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方法。

【讨论】:

这对我有用,但是在调用 myscript 时,我的 main() 函数被调用了两次。我的 main 函数只包含一个print("Success!") 语句,我得到了两次输出。 补充一点,调用python -m script_proj只会产生1个输出 @rm-rf_,您是否使用if __name__ == "__main__": 来确保仅在将__main__.py 作为脚本而不是作为模块调用时才调用main? 知道了!只需要 main.py 中的 if __name__ == "__main__"。愚蠢的错误。非常感谢。 对于那些使用setup.cfg的人,请参阅this answer了解如何设置入口点。

以上是关于如何使用 setuptools 生成调用 `python -m mypackage` 的 console_scripts 入口点?的主要内容,如果未能解决你的问题,请参考以下文章

如何删除构建产品

如何部署Golang应用

Python 安装setuptools方法

如何使用 setuptools 和 setup.py 从包中排除单个文件

如何获得 setuptools 和 easy_install?

python怎么打包整个项目