Получить все импортированные имена с помощью джедая - PullRequest
0 голосов
/ 06 апреля 2020

В моем проекте есть следующая структура пакета:

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 со всеми их членами. Как я могу это сделать?

...