модуль импорта относительно текущего скрипта (за пределами верхнего уровня) - PullRequest
1 голос
/ 26 сентября 2019

У меня есть проект a с несколькими версиями main#.py, поэтому я организовал их в каталог с именем run.Я обычно запускаю проект a из ./a, вызывая python run/main1.py.Поскольку main1.py включает импорт за пределы пакета верхнего уровня, мне нужно указать sys.path.insert(0, "./") в main1.py.

Теперь я создал проект b, который импортирует main1.py из a.От b\main.py, как мне заставить main1.py импортировать a/utils.py конкретно?

Требования:

  1. Проект a - это проект, над которым я долго работалназад, поэтому я хотел бы внести ограниченные изменения только в его заголовки.Я бы хотел, чтобы python run/main1.py работал так, как работает в настоящее время.

  2. Я могу перемещать проекты между разными компьютерами, поэтому main1.py необходимо импортировать utils.py относительно себя.(т.е. без импорта с абсолютным путем)

  3. Я бы хотел, чтобы решение было масштабируемым.b потребуется импортировать модули из нескольких других проектов, структурированных как a.Я чувствую, что расширение системной переменной PATH может просто испортить ситуацию.Есть ли более точное решение?

Файлы моих проектов выглядят следующим образом:

  • a
    • run
      • main1.py
    • utils.py
  • b
    • main.py
    • utils.py

в a/run/main1.py:

import sys
sys.path.insert(0, "./")
from utils import hello    # Anyway to specify this to be ../utils.py ?
hello()

в a/utils.py:

def hello():
    print('hello from a')

в b/main.py:

import sys
sys.path.append("../")
from a.run import main1

import utils
utils.hello()

in b/utils.py:

def hello():
    print('hello from b')

Это текущий результат.Я хотел бы, чтобы в первой строке было напечатано «привет от»:

>>> python run/main1.py:
hello from a
>>> cd ../b
>>> python run/main.py:
hello from b           (we want this to be "hello from a")
hello from b
...