Переопределить пространство имен в Python
-
11-09-2019 - |
Вопрос
Допустим, есть папка «/home/user/temp/a40bd22344».Имя полностью случайное и меняется на каждой итерации.Мне нужно иметь возможность импортировать эту папку в Python, используя фиксированное имя, скажем, «проект».Я знаю, что могу добавить эту папку в sys.path, чтобы включить поиск при импорте, но есть ли способ заменить «a40bd22344» на «проект»?
Может быть, есть какие-нибудь хитрые хаки в этом.py?
Добавлен:
Он должен быть глобальным, то есть другие скрипты загружают «проект» по стандарту:
import project
Придется работать правильно, вместо этого загружая a40bd22344.
Решение
Сначала вы импортируете его с помощью Импортировать:
>>> __import__('temp/a40bd22344')
<module 'temp/a40bd22344' from 'temp/a40bd22344/__init__.py'>
Затем вы убедитесь, что этот модуль известен Python как project
:
>>> import sys
>>> sys.modules['project'] = sys.modules.pop('temp/a40bd22344')
После этого все, что импортирует проект в текущем сеансе Python, получит исходный модуль.
>>> import project
>>> project
<module 'temp/a40bd22344' from 'temp/a40bd22344/__init__.py'>
Это будет работать также для подмодулей:если у вас есть foobar.py в том же месте, вы получите
>>> import project.foobar
>>> project.foobar
<module 'project.foobar' from 'temp/a40bd22344/foobar.py'>
Приложение. Вот что я выполняю:
>>> print sys.version
2.5.2 (r252:60911, Jul 31 2008, 17:28:52)
[GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)]
Другие советы
Вот один из способов сделать это, не трогая sys.path, используя команду imp
модуль на Python:
import imp
f, filename, desc = imp.find_module('a40bd22344', ['/home/user/temp/'])
project = imp.load_module('a40bd22344', f, filename, desc)
project.some_func()
Вот ссылка на хорошую документацию по imp
модуль:
Конечно, project = __import__('a40bd22344')
после sys.path
настроен правильно, будет работать.
Предположим, вы хотите сделать это в функции, принимающей полный путь в качестве аргумента и устанавливающей Глобальный импорт project
должным образом (а также волшебным образом создавая import project
работать потом в других модулях).Кусок пирога:
def weirdimport(fullpath):
global project
import os
import sys
sys.path.append(os.path.dirname(fullpath))
try:
project = __import__(os.path.basename(fullpath))
sys.modules['project'] = project
finally:
del sys.path[-1]
это также оставляет sys.path в том виде, в каком он его нашел.