Подтвердить что ты не робот

Как получить текущие пути импорта в Python?

Я получаю исключение ImportError где-то в коде, но тот же модуль можно безопасно импортировать при запуске приложения. Мне любопытно узнать, какие пути Python ищет модули для импорта, чтобы я мог проследить, почему эта проблема возникает. Я нашел это:

print sys.path

Является ли это списком всех путей, которые система ищет при попытке импортировать модуль?

4b9b3361

Ответ 1

Местоположения путей, которые Python проверяет по умолчанию, можно проверить, проверив sys.path.

import sys
print(sys.path)

Ответ 2

Если вы хотите немного лучше форматировать:

import sys

from pprint import pprint

pprint(sys.path)

Ответ 3

Sys.path - список всех путей, которые Python просматривает при поиске импорта. Если вы хотите добавить еще один путь в каталог, содержащий один или несколько файлов python, вы можете использовать: sys.path.append('path/to/directory').

Ответ 4

Другие ответы почти правильные

Python 3:

import sys
import_paths = sys.path

В Python 2.7:

import sys
import os
import copy
import_paths = copy.copy(sys.path)
if '__file__' in vars(): import_paths.append(os.path.abspath(os.path.join(__file__,'..')))

В обеих версиях основной файл (т. __name__ == '__main' равен True) автоматически добавляет свой собственный каталог в sys.path. Однако Python 3 импортирует только модули из sys.path. Python 2.7 импортирует модули как из sys.path и из каталога текущего файла. Это актуально, когда у вас есть такая файловая структура:

|-- start.py
|-- first_import
|   |-- __init__.py
|   |-- second_import.py

с содержанием
start.py:
import first_import
__init__.py:
import second_import.py

В Python 3 прямой запуск __init__.py будет работать, но когда вы запустите start.py, __init__.py не сможет import second_import.py потому что он не будет в sys.path.

В Python 2.7 при запуске start.py __init__.py сможет import second_import.py даже если его нет в sys.path поскольку он находится в той же папке, что и он.

К сожалению, я не могу придумать, как идеально дублировать поведение Python 2.7 в Python 3.