2017-01-15 3 views
3

У меня есть проект python, который должен иметь возможность запускать внешние скрипты.Повторный импорт другого модуля python с тем же именем

Эти сценарии динамически импортируются в структуру каталогов с несколькими модулями.

Теперь, поскольку эти сценарии написаны независимо и не знают друг о друге, они часто используют те же имена модулей.

Это делает его проблематичным для меня при импорте их один за другим.

Например, вот моя структура каталогов:

  • main.py
      • a.py
      • utils.py
    • б
      • b.py
      • utils.py

Так у меня есть сценарий main.py в корневой папке и 2 "внешние" скрипты в а и б папок.

Оба сценария используют другой модуль utils.py.

Содержание а/a.py:

import utils 
utils.hello() 

содержимое/utils.py:

def hello(): 
    print 'hello from a' 

Содержание ч/b.py:

import utils 
utils.hello() 

Содержание от b/utils.py:

def hello(): 
    print 'hello from b' 

Содержание main.py

import sys 
sys.path.append('a') 
import a 
sys.path.append('b') 
import b 

Теперь, этот пример печатает:

hello from a 
hello from a 

И я, очевидно, нужно, чтобы напечатать:

hello from a 
hello from b 

Как я не In- заряд «внешних» сценариев, и я не могу их изменить, есть ли способ, которым я могу это сделать?

редактировать

Использование @ Мойнуддин-Quadri ответ импорта, как: от импорта действительно работает для этого простого примера, но что об этом:

  • main.py
    • a
      • a.py
      • Lib
        • utils.py
      • lib2
        • utils2.py
    • б
      • b.py
      • Lib
        • utils.py
      • lib2
        • utils2.py

Где каждый utils.py делает:

из Lib2 импорта utils2

Для этой работы мне нужна корневая папка сценария, чтобы быть на sys.path

Когда б/Библиотека/Utils пытается запустить: от Lib2 импорта utils2, он получает utils2 в/lib2

ответ

2

Вы должны использовать относительно импорта в a.py и b.py. Таким образом, ваш импорт должен быть как:

from . import utils 

что означает из текущего каталога, импорт утилитами. Таким образом, вы спросите вашего питона программы импортировать а/utils.py в а/a.py и б/utils.py в б/b.py.

Во-первых, создать __init__.py в каталоге, имеющей main.py (предполагается, что __init__.py является alread присутствует в a и b), а затем импортировать и б в главном.ру как:

from a import a # No need to do `sys.path.append('a')` 
from b import b 

# For importing utils.py (if needed) 
from a import utils as a_utils 
a_utils.hello() 

from b import utils as b_utils 
b_utils.hello() 

Также читайте:

+0

Спасибо! это работает, хотя я не уверен, почему ... –

+0

@GuyErlich Добавлены некоторые ссылки. Вы можете найти те полезные –

+0

ОК, я нашел более сложное объяснение, которое все еще не работает. см. новое редактирование –

0

Обычно, чтобы импортировать модули, мы не должны использовать sys.path:

main.py

from a import a 
# first 'a' is the directory. second 'a' is a.py 
# the 'a' directory needs to have __init__.py which can be blank 
from b import b 

а/a.py

from . import utils 

б/b.py

from . import utils 

Поскольку вы не можете изменять внешние модули, вы можете переименовывать модули, имеют те же названия при импорте:

main.py

from a import utils as utils_a 
from b import utils as utils_b 

utils_a.hello() 
utils_b.hello() 
+0

Спасибо, но, как я уже сказал, я не могу изменить содержимое a.py и b.py, а также не импортировать utils. a.py и b.py выполните импорт. –

Смежные вопросы