Вопрос

Допустим, есть папка «/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 в том виде, в каком он его нашел.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top