#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
их, когда вы тестируете подобный файл pypython 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 »