В моем проекте есть следующая структура пакета:
root
|
---utils
| |__ pluginbase.py
| |__ __init.py__ and other modules...
|
---plugins
| |__ plugin1.py, plugin2.py, ...
| |__ __init__.py
__init__.py
в plugins
добавляет пакет utils
к sys.path
, поэтому плагины могут импортировать из него модули:
import os, sys
sys.path.append(os.path.abspath('../utils'))
Пакет plugins
содержит файлы плагинов со следующим примером кода:
from utils.pluginbase import *
class PxPlugin1(PxPluginGeneral):
@before
def leaveEvent(self, event: PyQt5.QtCore.QEvent):
print('!')
# other code...
utils.pluginbase.py
импортирует необходимые модули и определяет классы:
import PyQt5
from yapsy.IPlugin import IPlugin
from .pluginmanager import PxPluginManager
class PxPluginBase(IPlugin):
""" etc etc """
class PxPluginGeneral(PxPluginBase):
pass
Теперь я хочу получить все ссылки (имена) из любого плагина в пакете plugins
, используя Джедай , используемый позже в редакторе синтаксиса для автозавершения кода. У меня есть следующая функция для этой функции, определенная в utils.utils.py
:
# collect ALL names from plugin script
def get_script_members(script: str):
# METHOD 1: pass _project argument with utils package
#jscript = jedi.Script(script, _project=jedi.api.Project(os.path.abspath('utils')))
# METHOD 2: add utils path to sys_path argument
jscript = jedi.Script(script, sys_path=sys.path + [os.path.abspath(os.path.dirname(__file__))])
# collect builtin names
res = get_builtins()
# get all names from this script...
# >>> from... imports are not added!!!
for d in jscript.get_names(all_scopes=True, definitions=True, references=True):
res.append(d.name)
if d.type == 'function':
for ds in d.get_signatures():
res.append(ds.to_string().replace('(self, ', '(').replace('(self)', '()'))
return res
Однако, какой бы метод я ни выбрал для добавления пакетов utils
и / или plugins
в пространство имен jedi.Script
, нет косвенно импортированные имена добавляются в список результатов.
Я ожидаю, что результирующий список будет содержать все импортированные с
from utils.pluginbase import *
в плагине, то есть, по крайней мере: PyQt5
, IPlugin
, PxPluginManager
, PxPluginBase
и PxPluginGeneral
со всеми их членами. Как я могу это сделать?