Импорт модуля Python по пути - PullRequest
       10

Импорт модуля Python по пути

2 голосов
/ 14 сентября 2011

У меня следующая неудачная ситуация:

Три каталога (A, B и C) содержат модуль Python M с функцией F.(Эти каталоги не являются пакетами, и изменить ситуацию невозможно.)

Я ищу способ импортировать их отдельно для доступа к их функциям.Как мне нужно импортировать эти модули для доступа к F примерно так:

A.F()
B.F()
C.F()

Ответы [ 4 ]

4 голосов
/ 14 сентября 2011

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

from types import ModuleType

with open("A/M.py") as a:
    A = ModuleType('A')
    exec a.read() in A.__dict__

with open("B/M.py") as b:
    B = ModuleType('B')
    exec b.read() in B.__dict__

with open("C/M.py") as c:
    C = ModuleType('C')
    exec c.read() in C.__dict__

Затем обращайтесь к ним, как BF (), как вы хотели.Единственная проблема заключается в том, что метаданные модуля настроены неправильно, поэтому они будут отображаться как встроенные.Даже тогда вы можете:

import sys
sys.modules['A'] = A
sys.modules['B'] = B
sys.modules['C'] = C

, и они будут импортированы, как import A из других частей вашего приложения.

4 голосов
/ 14 сентября 2011

Это сработает, но выглядит немного не элегантно ...

import sys

sys.path.append("A")
import M as A

sys.path.pop()
del sys.modules['M']

sys.path.append("B")
import M as B

and so on...
1 голос
/ 14 сентября 2011

положить __init__.py в каждом A / B / и C /. Содержимое этого файла

from M import F

Чем должен работать следующий код:

import A, B, C
A.F()
B.F()
C.F()

__init__.py объявляет каталог как пакет, а операторы в этом файле выполняются при импорте пакета.

0 голосов
/ 14 сентября 2011

использовать импорт как

from A.M import F as A_F
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...