如何注册Python标准库的入口点?

问题描述 投票:2回答:1

常规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 ...

它们来自哪里?

我如何列出所有标准库软件包的所有入口点?即不知道grouppkg_resources.iter_entry_points(group='<groupname>')名称?

python standard-library entry-point
1个回答
0
投票

它们作为可执行文件放在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())
© www.soinside.com 2019 - 2024. All rights reserved.