Эффект использования sys.path.insert (0, путь) и sys.path (добавление) при загрузке модулей

У меня недавно возникла проблема с python ImportError, где модуль был найден при работе на моем локальном компьютере, но не найден на сервере CI. Я решил эту проблему, заменив sys.path.append(path) в моем скрипте с помощью sys.path.insert(0, path) где path – это расположение строкового модуля.

Поскольку это мой модуль, а не установленный пакет ( связанный вопрос ), почему порядок путей исправить эту проблему?

2 Solutions collect form web for “Эффект использования sys.path.insert (0, путь) и sys.path (добавление) при загрузке модулей”

Поскольку python проверяет в каталогах в последовательном порядке, начиная с первого каталога в списке sys.path , пока он не найдет файл .py который он искал.

В идеале текущий каталог или каталог сценария является первым всегда первым элементом в списке, если вы не измените его, как вы. Из документации –

Как инициализировано при запуске программы, первым элементом этого списка является путь [0], это каталог, содержащий скрипт, который использовался для вызова интерпретатора Python. Если каталог сценария недоступен (например, если интерпретатор вызывается интерактивно или если скрипт считывается со стандартного ввода), путь [0] – это пустая строка, которая сначала направляет Python на поиск модулей в текущем каталоге. Обратите внимание, что каталог сценариев вставлен перед вставками в результате PYTHONPATH.

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

Также обратите внимание на ImportError s, скажем, ошибка импорта – ImportError: No module named main – это не означает, что main.py перезаписывается, нет, если это было перезаписано, у нас не будет проблем с чтением Это. Его некоторый модуль выше этого, который был перезаписан a. py или какой-либо другой файл.

Пример –

Моя структура каталогов выглядит так:

  - test - shared - __init__.py - phtest.py - testmain.py 

Теперь из testmain.py , я звоню from shared import phtest , он отлично работает.

Теперь скажем, что я представляю shared.py в test каталоге`, например –

  - test - shared - __init__.py - phtest.py - testmain.py - shared.py 

Теперь, когда я пытаюсь сделать from shared import phtest из testmain.py , я получу ошибку –

 ImportError: cannot import name 'phtest' 

Как вы можете видеть выше, файл, вызывающий проблему, является shared.py , а не phtest.py .

Я довольно новичок в Python, и я нашел ответ Ананда очень хорошим, но довольно сложным для меня, поэтому я пытаюсь переформулировать:

1) методы insert и append не относятся к sys.path и, как и на других языках, они добавляют элемент в список или массив и:
* append(item) добавить item в конец списка,
* insert(n, item) вставляет item в n-ю позицию в списке ( 0 в начале, 1 после первого элемента и т. д.).

2) Как сказал Ананд, python ищет файлы импорта в каждом каталоге пути в порядке пути, поэтому:
* Если у вас нет конфликтов имен файлов, порядок пути не влияет,
* Если вы посмотрите на функцию, уже определенную в пути, и вы используете append для добавления своего пути, вы не получите свою функцию, а предопределенную.

Но я думаю, что лучше использовать append и не insert чтобы не перегружать стандартное поведение Python и использовать недвусмысленные имена для ваших файлов и методов.

  • Python не может найти модули с набором PYTHONPATH
  • Заказ PYTHONPATH на Ubuntu 14.04
  • Mac Swampy (модуль обучения Python)
  • Python: совместное использование общего кода среди семейства скриптов
  • Где разместить файл конфигурации в Python?
  • не может добавить искру к PYTHONPATH
  • Virtualenv, no-site-packages, sys.path
  • Разработка и использование одного и того же Python на одном компьютере
  • Каков самый чистый способ добавить каталог сторонних пакетов в начало пути Python?
  • Настройка пути python для sublimerepl из возвышенного текста?
  • Постоянно добавлять каталог в PYTHONPATH
  • Python - лучший язык программирования в мире.