如何注册网络python包安装的入口点?

Bre*_*bel 8 python software-distribution setuptools

我有一个用户环境,其中大多数python包安装在网络共享上,并通过PYTHONPATH环境变量提供.Python本身仍然在本地安装.其中一些软件包需要注册setuptools 入口点.通常,这可以通过运行setup.py包的文件来实现,但由于这些安装在网络位置,因此setup.py永远不会使用本地安装的python运行.

有没有办法注册入口点而不在本地python安装中安装包?

注册插件系统回调的入口点示例

setup(
    ...
    entry_points={
        'xx_plugin': ['value = package.module:func'],
    }
) 
Run Code Online (Sandbox Code Playgroud)

Lex*_*ick 4

跑步setup.py

和入口点创建包装可调用对象的独立脚本console_scriptsgui_scriptscoverage包就是一个很好的例子。为了方便起见,它有一个入口点来创建包装器脚本。setup.py创建控制台脚本的示例片段:

setup(
    ...
    entry_points = {
        'console_scripts': [
            'script_name = package.module:function'
        ]
    }
)
Run Code Online (Sandbox Code Playgroud)

可以通过 .仅将脚本安装到指定目录setup.py。除非传递参数,否则现有脚本不会被覆盖--force

python setup.py install_scripts --install-dir /some/alternate/location
Run Code Online (Sandbox Code Playgroud)

对于插件,入口点作为元数据存储在通常与包一起安装的 Egg 中。示例插件入口点:

setup(
    ...
    entry_points = {
        'group_name': [
            'plugin_name = package.module:function'
        ]
    }
)
Run Code Online (Sandbox Code Playgroud)

可以通过 .仅将包的元数据(包括任何入口点)安装到指定目录setup.py

python setup.py egg_info --egg-base $PYTHONPATH
Run Code Online (Sandbox Code Playgroud)

自己滚动

如果setup.py无法运行来写入egg元数据,那么完全可以自己编写,因为它只是目录中的文本文件。基于上述入口点的示例元数据:

# $PYTHONPATH/entry_points.egg-info/entry_points.txt
[group_name]
plugin_name = package.module:function
Run Code Online (Sandbox Code Playgroud)

要测试入口点查找:

import pkg_resources as pkg

for entry_point in pkg.iter_entry_points('group_name'):
    plugin_name = entry_point.name
    plugin_module_name = entry_point.module_name
    plugin_callable = entry_point.load()
    # do something with plugin
Run Code Online (Sandbox Code Playgroud)