не удается импортировать модуль относительно каталога, в котором выполняется скрипт

#python #path #python-import #relative-path

#python #путь #python-импорт #относительный путь

Вопрос:

Насколько я понимаю, на данный момент python импортирует модуль по пути относительно каталога, несмотря на то, что исходный файл находится где-либо еще.

например:

 bar
 |-foo.py
 |-foo1.py
 

поэтому, если мы хотим получить доступ fo01.py через
foo.py from bar , я бы подумал, что мне нужно сделать
from bar import foo1 . Но первое, похоже, не работает.

Поскольку это не так, возникает следующая проблема:

если у нас теперь есть другой каталог — examples

 bar
 |-foo.py
 |-foo1.py
examples
 |- getfoo.py
 

Как мы можем получить доступ foo foo1 к примерам и bar из getfoo.py -под них? (Моей общей интуицией было бы импортировать foo из области видимости bar.<foo> , но это не работает)

Ответ №1:

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

вот дерево каталогов (которое следует за вашим)

 .
├── bar
│   ├── foo1.py
│   └── foo.py
└── examples
    └── getfoo.py
 

и в нем есть переменная с именем var foo1.py и foo.py

Вопрос I:

поэтому, если мы хотим получить доступ fo01.py через foo.py из бара, я бы подумал, что мне нужно сделать из бара импорт foo1. Но первое, похоже, не работает.

Ответ я:

В foo.py . вы должны изменить from bar import foo1 на from foo1 import xxx ( xxx это то, что вы хотите от foo1.py )

Вопрос II:

Как мы можем получить доступ к foo и foo1 под bar из getfoo.py под примерами? (Моей общей интуицией было бы импортировать foo из области bar., но это не работает)

Ответ II:

Вы не можете импортировать подобные модули, прежде чем добавлять sys path их, когда вы тестируете подобный файл py python getfoo.py . если вы хотите сделать что-то вроде from bar import foo , вам может понадобиться sys.path.append('path/to/bar') , после чего вы можете выполнить импорт.

Пояснения:

это вещи python interpret path . который вы можете найти в python sys.path

когда мы это делаем python file.py , интерпретатор создает список, содержащий все каталоги, которые он будет использовать для поиска модулей при автоматическом импорте.

вы можете увидеть список с import sys; print(sys.path)

проблема в том, что этот список содержит только каталог, в котором находится file.py находится и некоторый системный путь, который принадлежит python.

Итак, в bar каталоге вы можете получить доступ foo1.py через foo.py использование from foo1 import xxx . или from foo import xxx в foo1.py

Но вы не можете импортировать bar getfoo.py в. это потому, что интерпретатор python не знает, где его найти. поэтому, если вы хотите импортировать вещи, сообщите интерпретатору с помощью sys.path.append('path/to/add')

Комментарии:

1. дело в том, что python interpret path это довольно интересно. Конечно, объясняет, почему, когда программа запускается из любого каталога, все местоположения для модулей импорта остаются доступными для поиска, тем самым сохраняя свои относительные пути.

2. однако, когда в нем есть <module> __init__.py , необходимо указать полный путь к модулю из области действия модуля, который имеет __init__.py

Ответ №2:

Попробуйте импортировать foo1.py в getfoo1.py используя свой путь.

 import ../bar/foo1.py
 

Или
скопировать вставить foo1.py в примерах, а затем вызовите

 import foo1.py
 

Пожалуйста, проверьте синтаксис для «import ../bar/foo1.py »