Ответ 1
Местоположения путей, которые Python проверяет по умолчанию, можно проверить, проверив sys.path
.
import sys
print(sys.path)
Я получаю исключение ImportError
где-то в коде, но тот же модуль можно безопасно импортировать при запуске приложения. Мне любопытно узнать, какие пути Python ищет модули для импорта, чтобы я мог проследить, почему эта проблема возникает. Я нашел это:
print sys.path
Является ли это списком всех путей, которые система ищет при попытке импортировать модуль?
Местоположения путей, которые Python проверяет по умолчанию, можно проверить, проверив sys.path
.
import sys
print(sys.path)
Если вы хотите немного лучше форматировать:
import sys
from pprint import pprint
pprint(sys.path)
Sys.path
- список всех путей, которые Python просматривает при поиске импорта. Если вы хотите добавить еще один путь в каталог, содержащий один или несколько файлов python, вы можете использовать: sys.path.append('path/to/directory')
.
Другие ответы почти правильные
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.