我想成为一个优秀的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方法.