gpt4 book ai didi

python - 告诉 __import__ 在哪里看 - 我是否坚持使用 sys.path?

转载 作者:太空狗 更新时间:2023-10-30 00:00:23 25 4
gpt4 key购买 nike

我有一个纯 Python 项目,带有一个基本的插件系统:您编写一个模块来定义一个具有特定接口(interface)和名称的类,程序导入该模块并随后根据需要实例化该类。

目前,插件都来自特定文件夹(主 .py 文件所在的子目录)。我希望能够将它们放在磁盘上的其他位置,并指示程序在特定位置查找插件。对于一次性动态导入,我能否以比修改 sys.path 更简洁的方式执行此操作?我不想污染这个全局。

相关:我可以指望 sys.path[0] 是脚本的路径,即使它不同于当前工作目录 (os.getcwd()) >)?

编辑:我忘了提 - 我希望能够从几个不同的文件夹中获取插件,用户指定插件文件夹的路径。目前,这些文件夹中的每一个都被设置为一个包(带有 __init__.py);如果它导致问题,我可以简单地废弃它。

最佳答案

这可能看起来很奇怪,但您可以修改模块的 __path__ 变量,然后从中导入。这样您就不会弄乱 sys.path 中的全局导入空间。

编辑:如果目录是在运行时加载的,那么您不需要 plugins.py 文件来存储它们。您可以动态创建模块:

主要.py:

#create the plugins module (pseudo-package)

import sys, os

sys.modules['plugins'] = plugins = type(sys)('plugins')

plugins.__path__ = []
for plugin_dir in ['plugins1', 'plugins2']:
path = os.path.join(sys.path[0], 'addons', plugin_dir)
plugins.__path__.append(path)

创建动态模块后,您可以像以前一样加载插件,使用 import_module__import__:

from importlib import import_module

myplugins = []
for plugin in ['myplugin1', 'myplugin2']:
myplugins.append(import_module('plugins.' + plugin))
myplugins[-1].init()

##or using __import__:

myplugins = []
for plugin in ['myplugin1', 'myplugin2']:
myplugins.append(getattr(__import__('plugins.' + plugin), plugin))
myplugins[-1].init()

addons/plugins1/myplugin1.py:

def init():
print('myplugin1')

addons/plugins2/myplugin2.py:

def init():
print('myplugin2')

我从未使用过它,但它在 Python 2 和 3 中都有效。

关于python - 告诉 __import__ 在哪里看 - 我是否坚持使用 sys.path?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7218673/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com