Произвольно изменить и импортировать модуль Python после импорта - PullRequest
1 голос
/ 26 октября 2019

Прежде всего, немного контекста. Я использовал importlib для изменения импорта и пытался найти решение для изменения импортированного файла. Я видел ответ , предлагающий, чтобы для произвольного изменения импортированного модуля вы могли использовать этот код

def modify_and_import(module_name, package):
    spec = importlib.util.find_spec(module_name, package)
    source = spec.loader.get_source(module_name)
    new_source = tokens.tokenize(source)
    module = importlib.util.module_from_spec(spec)
    codeobj = compile(new_source, module.__spec__.origin, 'exec')
    exec(codeobj, module.__dict__)
    sys.modules[module_name] = module
    return module

Теперь я запустил его с помощью следующего вызова

o = modify_and_import('o', "./o.xran")

, нозапуск его через exec дает мне следующую ошибку

AttributeError: у объекта 'NoneType' нет атрибута 'loader'

Затем я попытался напечатать 'spec', нополучил None, так что я думаю, что spec возвращается, пока существует файл с именем o.xran.

Ответы [ 2 ]

0 голосов
/ 27 октября 2019

Хорошо, через день я наконец заработал, и так как я работал только с локальными файлами, мне вообще не нужно было использовать imp. Вот мой окончательный код

with open(module_name) as f:
  source = f.read()
source = tokens.tokenize(source)
module = types.ModuleType(module_name)
exec(source, module.__dict__)
sys.modules[module_name] = module
return module

Спасибо всем, кто ответил или попытался внести свой вклад.

0 голосов
/ 26 октября 2019

братан, откройте измененный модуль в вашем текстовом редакторе, в том же окне, в котором открыт ваш проект, затем импортируйте его в свой проект, используя 'from import *' .. надеюсь, он будет работать .. спасибо

...