Как сделать оператор импорта в скрипте Python, который вызывается из двух разных контекстов - PullRequest
0 голосов
/ 27 апреля 2018

Я пытаюсь импортировать файл, но могу заставить его работать только из одного контекста за раз.

Это моя структура проекта:

.
├── module/
│   ├── __init__.py
│   ├── script.py
│   ├── utilities1.py
│   └── utilities2.py
└── test.py

script.py обычно вызывается извне, напрямую импортирует utilities1.py

utilities1.py импорт utilities2 .py

test.py Это файл, который содержит тесты и включает в себя utilities1.py и utilities2.py

У меня вопрос, как сделать оператор импорта в utilities1.py Когда я звоню из script.py, это должно быть

import utilities2

Но когда я вызываю его с test.py, это приводит к ошибке, требующей, чтобы оно было

import module.utilities2

Есть ли способ, которым я могу получить правильную инструкцию import в обоих контекстах? Или мне нужно что-то структурно изменить в моем проекте? Спасибо :)

1 Ответ

0 голосов
/ 01 мая 2018

Если вы хотите использовать import utilities1 из test.py, вы можете изменить путь поиска модулей. sys.path - список путей, по которым интерпретатор будет искать модули для импорта. Сделай print(sys.path) и ты увидишь. Вы также можете изменить его во время работы скрипта.

Например, следуя описанной вами файловой структуре

# script.py

import utilities1
import utilities2

utilities1.show_myself()
utilities2.show_myself()

1011 *

# utilities1.py

def show_myself():
    print("I'm utilities1")

def test_myself():
    print("Testing who I am... The answer: utilities1")

1014 *

# utilities2.py

def show_myself():
    print("I'm utilities2")

def test_myself():
    print("Testing who I am... The answer: utilities2")

1017 *

# test.py

import sys

sys.path.insert(1, "module")

import utilities1
import utilities2

utilities1.test_myself()
utilities2.test_myself()

В test.py я вставил module в sys.path, который представляет собой относительный путь, по которому исполняемый скрипт будет искать модули utilities1 или utilities2. Вот почему он может напрямую подключаться к этим двум модулям.

Если это не то, что вы пытались сделать, пожалуйста, объясните дальше.

...