Люди указали маршрут sys.path.append("..")
. Хотя это работает, существует также альтернативный метод с os.chdir('..')
. Вы можете просмотреть список путей с помощью следующей команды python3 -m site
. При импорте пакетов Python проверяет наличие модулей во всех этих путях.
Первый элемент в вашем sys.path
является текущим рабочим каталогом.
Может быть сценарий, когда вы не хотите ваш текущий рабочий каталог должен быть частью пути и вы хотите, чтобы одна структура папок была добавлена к пути.
«Проблема» в том, что существует несколько способов импорта одного и того же. Например, у вас есть:
project/
├── important.py
└── files
├── file1.py
└── file2.py
Выполнив sys.path.append("..")
и запустив программу через python3 file1.py
, вы можете импортировать файл2 через import file2
или from files import file2
. Это выглядит не очень хорошо, и вы можете начать писать несовместимый код, не понимая, как правильно работает импорт.
Вы можете придерживаться sys.path.append("..")
, если он работает. Вы не будете делать много плохого с этим. Это общий подход многих людей. Может быть просто особый сценарий, в котором вы можете столкнуться с проблемами, поэтому многие люди предпочитают подход os.chdir()
.
Например, в папке, верхней папке и подпапке у вас есть python модули, которые совместно используют одно и то же имя Вы хотите импортировать Python модулей из одной папки вверх, но не python модулей в текущей папке.
Пример os.chdir()
в действии:
Tin@ubuntu:~/Desktop/tmp/test$ python3
Python 3.6.8 (default, Oct 7 2019, 12:59:55)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.getcwd()
'/home/Tin/Desktop/tmp/test'
>>> import helloworld
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'helloworld'
>>> os.chdir('..')
>>> import helloworld
hello world!
>>> os.getcwd()
'/home/Tin/Desktop/tmp'
Теперь вы можете импортировать из одного каталога вверх, и импорт больше не является неоднозначным.
Обратите внимание, что пока я писал os.chdir('..')
, вы можете делать то, что делал @Tawy.
import os
os.chdir(os.path.dirname(os.path.dirname(os.path.realpath(__file__))))
# OR:
os.chdir(os.path.join(os.path.dirname(os.path.realpath(__file__)), '..'))
Это выглядит запутанно но с этим вы можете внутренне представить, какой у вас текущий рабочий каталог, и основывать на этом все ваши операторы импорта. Он также дает вам согласованный текущий рабочий каталог, когда вы выполняете свой скрипт из всех видов подкаталогов, но ожидаете определенного рабочего каталога.
Вы также можете сделать ошибку, запустив os.chdir('..')
дважды, что сделает вас go двумя структура папок:
Короче:
Наименее сложное решение - sys.path.append("..")
. Более чистое решение будет os.chdir(os.path.join(os.path.dirname(os.path.realpath(__file__)), '..'))
, где ..
будет относительным местоположением для вашего требуемого рабочего каталога.