如何使用 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 入口点?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 setuptools 和 setup.py 从包中排除单个文件