如何动态添加和加载入口点?

2023-12-28

我正在开发一个带有使用入口点的插件的 Slack 机器人。我想在运行时动态添加插件。

我有一个具有以下结构的项目:

+ ~/my_project_dir/
    + my_projects_python_code/
    + plugins/
        - plugin1.py
        - plugin2.py
        - ...
        - pluginN.py
    - setup.py
    - venv/
    - install.sh

My setup.py文件看起来像这样:

from setuptools import setup, find_packages

setup(
    name="My_Project_plugins",
    version="1.0",
    packages=['plugins'],
    entry_points="""
        [my_project.plugins]
        plugin1 = plugins.plugin1:plugin1_class
        plugin2 = plugins.plugin2:plugin2_class
        ...
        pluginN = plugins.pluginN:pluginN_class
    """
        )

Running sudo install.sh执行以下操作:

  1. 将需要的文件复制到/usr/share/my_project_dir/

  2. 激活 virtualenv 在/usr/share/my_project_dir/venv/bin/activate

  3. Run: python setup.py develop

这按预期工作并正确设置我的入口点,以便我可以通过机器人使用它们。

但我希望能够添加一个插件setup.py并能够在机器人运行时使用它。所以我想添加一行:pluginN+1 = plugins.pluginN+1:pluginN+1_class并且有插件N+1可供使用。

我尝试/学到的:

  • After /usr/share/my_project_dir/venv/bin/activate我打开一个 Python 交互式 shell 并迭代pkg_resources.iter_entry_points(),其中列出了从 setup.py 初始状态加载的所有内容(即plugin1到pluginN)

  • 如果我添加一行setup.py并运行sudo python setup.py develop并使用相同的 Python shell 再次迭代,它不会拾取新插件,但如果我退出 shell 并重新打开它,则会拾取新插件。

  • 我注意到当我安装机器人时,部分输出显示:

    • Copying My_Project_plugins-1.0-py2.7.egg to /usr/share/my_project-dir/venv/lib/python2.7/site-packages
  • When I cd /usr/share/my_project_dir/,激活我的 virtualenv,然后运行setup.py从外壳上看,它说:

    • Creating /usr/local/lib/python2.7/dist-packages/My_Project-plugins.egg-link (link to .) My_Project-plugins 1.0 is already the active version in easy-install.pth

我需要做一些类似的事情来加载虚拟插件以进行测试。这与您的用例略有不同,因为我专门试图避免需要在包中定义入口点(因为它只是测试代码)。

我发现我可以动态地将条目插入到 pkg_resources 数据结构中,如下所示:

import pkg_resources
# Create the fake entry point definition
ep = pkg_resources.EntryPoint.parse('dummy = dummy_module:DummyPlugin')

# Create a fake distribution to insert into the global working_set
d = pkg_resources.Distribution()

# Add the mapping to the fake EntryPoint
d._ep_map = {'namespace': {'dummy': ep}}

# Add the fake distribution to the global working_set
pkg_resources.working_set.add(d, 'dummy')

这在运行时向“namespace”添加了一个名为“dummy”的入口点,这将是“dummy_module.py”中的类“DummyPlugin”。

这是通过使用 setuptools 文档和对象上的 dir() 来根据需要获取更多信息来确定的。

文档在这里:http://setuptools.readthedocs.io/en/latest/pkg_resources.html http://setuptools.readthedocs.io/en/latest/pkg_resources.html

你可能会特别看一下http://setuptools.readthedocs.io/en/latest/pkg_resources.html# located-plugins http://setuptools.readthedocs.io/en/latest/pkg_resources.html#locating-plugins如果您需要做的只是加载刚刚存储到本地文件系统的插件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何动态添加和加载入口点? 的相关文章

  • 从 1D 列表创建 2D 列表

    我对 Python 有点陌生 我想将一维列表转换为二维列表 给定width and length这个的matrix 说我有一个list 0 1 2 3 我想做一个2 by 2该列表的矩阵 我怎样才能得到matrix 0 1 2 3 widt
  • Python Tweepy:Twitter Api 说 /users/lookup 不存在

    我正在制作一个研究应用程序 研究具有高权威的 Twitter 用户之间的交互 其中一部分是提取有关用户的信息 我使用 Tweepy for Python 构建了一个应用程序 过去 2 天我一直在提取用户信息 没有出现任何问题 突然提出这样的
  • 如何从网站中抓取动态内容?

    所以我使用 scrapy 从亚马逊图书部分抓取数据 但不知何故我知道它有一些动态数据 我想知道如何从网站中提取动态数据 到目前为止我已经尝试过以下方法 import scrapy from items import AmazonsItem
  • Python 的“platform.mac_ver()”报告不正确的 MacOS 版本

    我正在使用Pythonplatform module https docs python org 3 library platform html要识别 MacOS 版本 如下所示 import platform print platform
  • 将预训练的手套词嵌入与 scikit-learn 结合使用

    我已经使用 keras 来使用预先训练的词嵌入 但我不太确定如何在 scikit learn 模型上执行此操作 我也需要在 sklearn 中执行此操作 因为我正在使用vecstack集成 keras 序列模型和 sklearn 模型 这就
  • Python3 类型错误:replace() 参数 1 必须是 str,而不是 int

    我已经尝试了几天让这段代码在 MacOS 上运行 但没有成功 你能看一下我错过了什么吗 运行 python 3 6 我已经上传了整个代码 多谢 usr bin env python3 from future import print fun
  • 每个刻度标签都有不同的颜色

    我正在尝试使用 matplotlib python 3 5 创建一个散点图 其中 x 轴上的每个刻度都有不同的颜色 这怎么可能 例如 假设 x 刻度为 Mo Tu We Th Fr Sa Su 现在我希望 Mo 是绿色的 Tu 是蓝色的 等
  • 在 python 中查找价格动量的有效方法:对列的最后 n 个条目求平均值

    我正在定义价格动量是给定股票过去动量的平均值n days 反过来 动量是一种分类 如果当天的收盘价高于前一天 则每天标记为 1 如果当天的收盘价低于前一天 则标记为 1 我的库存变化百分比如下 df close in percent np
  • 从内存中发送图像

    我正在尝试为 Discord 机器人实现一个系统 该系统可以动态修改图像并将其发送给机器人用户 为此 我决定使用 Pillow PIL 库 因为它对于我的目的来说似乎简单明了 这是我的工作代码的示例 它加载一个示例图像 作为测试修改 在其上
  • Emacs:在缓冲区求值期间将参数传递给下级 Python shell

    最近我开始使用 Emacs 作为 Python IDE 它不太直观 我现在遇到的问题是当使用 C c C c 评估缓冲区时如何将命令行参数传递给下级 python shell 感谢帮助 这似乎并不容易实现 管理的劣质流程python el模
  • 如何在 Python for 循环中获取 GAE ndb 中当前记录的密钥?

    我目前有一个网页 其中显示数据存储中的记录列表以及编辑链接 我想从数据库转换它 至新开发银行 我是 Python 和 GAE 新手 当前代码 tbody for listtype in listtypes tr td listtype Li
  • 更新或插入 MySQL Python

    如果记录已存在 我需要更新一行 如果不存在 我需要创建一个新记录 我理解 ON DUPLICATE KEY 将使用 MYSQLdb 完成此操作 但是我无法使其正常工作 我的代码如下 cursor database cursor cursor
  • 将 Selenium 与 PyCharm CE 结合使用

    我正在尝试将 Selenium 与 PyCharm CE 一起使用 我已经使用 pip install Selenium 安装了 Selenium 并且可以通过终端使用它 但是当我尝试将它与 PyCharm 一起使用时 出现导入错误 Imp
  • 如何在 PyTorch 中对子集使用不同的数据增强

    如何针对不同的情况使用不同的数据增强 转换 Subset在 PyTorch 中吗 例如 train test torch utils data random split dataset 80000 2000 train and test将具
  • 当我移动我的 pygame 角色时,它会留下痕迹[重复]

    这个问题在这里已经有答案了 我一直在尝试用 Python 制作一个游戏 但是当我移动我的角色时 它会留下痕迹 我知道它并没有显示出那么多 但如果你靠近的话 你可以看到这条踪迹 这真的让我很困扰 这是我的代码 import pygame im
  • django 南迁移,不设置默认值

    我使用 South 来迁移我的 Django 模型 然而 南方有一个令人讨厌的错误 它不会在 Postgres 数据库中设置默认值 例子 created at models DateTimeField default datetime no
  • 如何使用 SymPy 求给定一阶导数的 n 阶导数?

    Given some f and the differential equation x t f x t how do I compute x n t in terms of x t For example given f x t sin
  • 使用条件在 pandas 数据框中生成新列

    我有一个 pandas 数据框 如下所示 portion used 0 1 1 0 1 2 0 3 2 3 0 0 3 4 0 8 我想根据以下内容创建一个新专栏used列 以便df看起来像这样 portion used alert 0 1
  • 访问 Scrapy 内的 django 模型

    是否可以在 Scrapy 管道内访问我的 django 模型 以便我可以将抓取的数据直接保存到我的模型中 我见过this https scrapy readthedocs org en latest topics djangoitem ht
  • 如何测试send_file烧瓶

    我有一个小型烧瓶应用程序 它需要上传一些图像并将它们转换为多页 tiff 没什么特别的 但是如何测试多个文件的上传和文件下载呢 我的测试客户端 class RestTestCase unittest TestCase def setUp s

随机推荐

  • 来自 AngularJS 的 Django CORS API

    我已经在 Django 中使用 django cors 启用了 CORS https github com ottoyiu django cors headers https github com ottoyiu django cors h
  • Numpy - 多个外积

    我想知道是否有一种方法可以计算多个外部产品并将结果堆叠在单个操作中 假设我有一个 Nx1 向量并与 1xM 向量进行外积 结果将是一个 NxM 矩阵 如果我有一个 NxR 矩阵 A 和一个 RxM 矩阵 B 会怎么样 是否可以构造一个 Nx
  • .NET 中的类数量?

    NET 中的类总数是多少 那个数字 位于下载的 NET 2 0 NET 3 0 和 NET 运行时中 3 5 SP1 我们正在写一篇关于应用程序的科学论文 基于 NET 目前声明还有更多 超过6000个班级 但我不确定这是否正确 数字 例如
  • Antlr 外部输入

    我有一个语法文件 BoardFile g4 其中包含 仅相关部分 grammar Board Tokens GADGET squareBumper circleBumper triangleBumper leftFlipper rightF
  • 如何为 UIWebView 设置自定义键盘

    如何为 iOS7 及更高版本的可编辑 UIWebView 显示自定义键盘和输入附件视图 即 我如何设置并使用其中的值 UIWebView setInputView and UIWebView setInputAccessoryView 了解
  • Google Contacts API - 获取访问令牌(oauth)后

    我设法获取谷歌联系人 API 的访问令牌 但是当我尝试调用以检索登录用户的个人资料时 我收到 401 未经授权的错误 我做了一些研究 并按照 各种 谷歌文档中提到的步骤进行操作 例如this one http code google com
  • gremlin-python 不是可用的 GremlinScriptEngine

    我正在尝试使用 gremlin python 在 AWS neptune 上执行 lambda 函数 它击中了我gremlin python is not an available GremlinScriptEngine 有人可以帮忙解决这
  • Java 比较器 Arrays.sort()

    我想排序一个arrayJava中的二维数组根据一些规则 比如说距原点的距离 我看到了几种使用方法Arrays sort 1 Arrays sort points Comparator comparing p gt p 0 p 0 p 1 p
  • 如何在react中使用信号协议

    如何在 React 中使用信号协议 I used npm libsignal但即使这样我在node modules 中也遇到了错误 我尝试使用libsignal protocol js文件来自 https github com signal
  • 您可以使用 Cloud Formation 创建使用计划吗?

    就像标题中一样 我可以仅使用 Cloud Formation 在 AWS 上部署内容 现在 我尝试使用 API 密钥来保护我的 API 网关 看起来我需要一个使用计划 这里的文档似乎没有涵盖它 http docs aws amazon co
  • 如何创建属性包含点(句点)的 json 字符串?

    我正在尝试发送HttpRequest它需要一个像这样的 JSON 对象 some setting withperiods myvalue 我一直在为其他请求创建匿名对象 但我无法对这个请求执行此操作 因为名称包含一个点 我知道我可以创建一个
  • phpunit - 需要有关有风险的测试的帮助

    我正在为一个网站实施一些测试 在一次特定的测试中 出现了这样的结果 event test suite Example V test test Example V test test 3 status error time 13 469105
  • 如何从命令行编译 MSVC 项目中的单个源文件?

    我即将开始对我们的构建进行一些基准测试 测试 并且我想从命令行驱动整个过程 我知道DevEnv但我不相信它可以做我想做的事 如果我可以在单个项目中构建单个文件 我会很高兴 这可以做到吗 其神奇咒语如下 请注意 这仅在 VS 2010 上进行
  • Azure CloudBlockBlob.DeleteIfExists() - false 是否始终意味着 blob 不存在?

    我知道如果 blob 存在 CloudBlockBlob DeleteIfExists 返回 true 如果不存在则返回 false 不过 我很好奇 如果 blob 确实存在 但 Azure 中出现问题 导致文件删除无法发生 我找不到有关该
  • Angular 2 路由器中间的通配符选择器

    我正在尝试使用 Angular js 2 开发一个项目 我正在尝试使用路由器 我正在尝试创建一条带有参数的路线来捕获如下内容 m SOMETHING1 c SOME THING2 p SOMETHING3 请注意 SOME THING2 是
  • Python 贝叶斯信念网络分类器

    谁能推荐一个用 Python 实现的贝叶斯信念网络分类器 它可以根据描述多个相互关联对象的一系列事实的稀疏网络的输入生成信念概率 例如鉴于 FOL 中表述的事实 X 饿了 是一只猴子 正在吃东西 如下所示 isHungry x isMonk
  • 简单设置关闭显示:none / block with javascript

    我有以下代码 table tr class odd td Entry 1 td tr tr class even clickable td gt Entry 2 td tr tr class even td ul li Informatio
  • Spring Rest 模板中的哑剧类型无效?

    我只是想发出一个简单的 REST 请求 如下所示 String url some url MultiValueMap
  • 尝试通过 --experimental-loader 选项使用 mocha、ES6 模块和 ts-node

    我正在尝试获取 ts node 选项 experimental loader与摩卡一起工作 但运气不佳 在我开始尝试编译 ES6 模块之前 我曾经能够通过这种方式运行 mocha 测试 test nyc reporter html moch
  • 如何动态添加和加载入口点?

    我正在开发一个带有使用入口点的插件的 Slack 机器人 我想在运行时动态添加插件 我有一个具有以下结构的项目 my project dir my projects python code plugins plugin1 py plugin