常规Python程序包在其setup.py
中注册入口点,或在pyporject.toml
文件中指定它们。如果他们不使用distutils / setuptools进行打包,则属于后者。例如,setuptools' own setup.py将此作为setuptools.setup()
的参数之一:
entry_points={
"setuptools.finalize_distribution_options": [
"parent_finalize = setuptools.dist:_Distribution.finalize_options",
"features = setuptools.dist:Distribution._finalize_feature_opts",
"keywords = setuptools.dist:Distribution._finalize_setup_keywords",
"2to3_doctests = "
"setuptools.dist:Distribution._finalize_2to3_doctests",
],
标准库软件包与python捆绑在一起时,如何注册其入口点?
例如,distutils
本身具有setup_keywords
组入口点。
>>> for ep in pkg_resources.iter_entry_points(group='distutils.setup_keywords'):
>>> print(ep)
convert_2to3_doctests = setuptools.dist:assert_string_list
dependency_links = setuptools.dist:assert_string_list
eager_resources = setuptools.dist:assert_string_list
exclude_package_data = setuptools.dist:check_package_data
extras_require = setuptools.dist:check_extras
include_package_data = setuptools.dist:assert_bool
install_requires = setuptools.dist:check_requirements
namespace_packages = setuptools.dist:check_nsp
package_data = setuptools.dist:check_package_data
# ... and so on ...
它们来自哪里?
我如何列出所有标准库软件包的所有入口点?即不知道group
的pkg_resources.iter_entry_points(group='<groupname>')
名称?
它们作为可执行文件放在Python安装的bin
目录中,并使用安装的解释器执行Python代码。例如:
$ which python
/path/to/envs/py38/bin/python
例如,在此目录中有2to3
:
$ cat /path/to/envs/py38/bin/2to3
#!/path/to/envs/py38/bin/python3.8
import sys
from lib2to3.main import main
sys.exit(main("lib2to3.fixes"))
您可以看到,我在Linux上,因此文件包含shebang line,它指向同一安装的解释器。
如果第三方程序包创建了入口点,则情况类似。将在安装程序的bin
目录中创建一个可执行文件,该目录通过安装程序的解释器调用pkg_resources.load_entry_point
函数。
您可以直接检查相应的文件以查看它们如何执行。例如mypy
:
$ cat /path/to/envs/py38/bin/pip
#!/path/to/envs/py38/bin/python
# -*- coding: utf-8 -*-
import re
import sys
from pip._internal.cli.main import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(main())