Как импортировать пользовательский модуль с тем же именем, что и системный модуль?

1

У меня есть унаследованная программа python, которая определила модуль, имя которого конфликтует с системным модулем в текущем python, что самый простой способ исправить это? Этот модуль был импортирован во многих местах, поэтому было бы здорово, если бы не было необходимости менять старый источник python.

  • 2
    Что не так с исправлением старого источника? Это легко сделать. Что тебя останавливает?
  • 0
    На этот модуль ссылаются во многих местах. Так что лучше, если есть какое-то другое простое изменение, которое может это исправить. В любом случае, изменение исходного кода может стать альтернативным решением.
Теги:

2 ответа

2
Лучший ответ

Вы можете создать пользовательскую процедуру импорта, используя imp module. Например, здесь я импортирую модуль с именем string, который затеняет настоящий строковый модуль:

import imp

def user_import(name, path):
    mod_file, mod_path, mod_desc = imp.find_module(name, [path])
    return imp.load_module(name, mod_file, mod_path, mod_desc)

# load the real 'string' module
import string
print string.digits

# load the user 'string' module which lives under the path './foo'
mod = user_import('string', './foo')
print mod.digits

Вывод:

0123456789
thesearenotdigits
1

Вы всегда можете переименовать модуль при его импорте, например:

import sys как realsys

realsys.exit(1)

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

В нижней строке, когда вы создаете модули, полезно более полно квалифицировать имя, например. вместо создания sys (в этом примере) вы могли бы создать mylib.sys.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню