Python3 ImportError несовместим в разных сборках - почему один и тот же проект может иметь ошибки на машинах разных людей?

Это очень хорошо, может быть дубликат, но я не смог решить эту проблему после нескольких часов поиска.

Основная проблема

Проект находится в git-репо; некоторые люди получают ошибки импорта, другие нет. Мы выдаем одинаковые команды для одинаковых проектов и получаем разные результаты. Там не было дурачества с sys.path или же PYTHONPATH переменные окружения (и мы хотим, чтобы так было;))

Структура проекта

src/               # Project Root
    pipeline/
        pipeline.py
    ui/
        main.py   # This is the script I want to run

а также main.py начинается с некоторого импорта:

from pipeline.pipeline import Pipeline
         # Amazing Code follows here! Really folks, this is some
         # tremendous code

Детали проблемы

Я работаю над проектом, использующим Python3, с шестью другими разработчиками. Некоторые из наших систем работают просто отлично; вызов python3 ui/main.py от src/ каталог, и он работает. Тем временем другие люди будут звонить python3 ui/main.py (то же самое) и получите ImportError:

ImportError: No module named pipeline

Когда я бегу print(os.getcwd()) от main.py я вижу src/ выводится на стандартный вывод (во всех системах, в том числе с ImportErrors). Я не могу понять, почему ошибки импорта происходят, так как pipeline Модуль должен быть виден с CWD. Мы все на Git, и мы не игнорируем __init__.py файлы в .gitignoreтак что на тяге те должны быть обновлены. Один из моих коллег даже вытащил весь git репо, и он все еще не работает.

Основные факты и диагностические инструменты:

  • Неработающие системы включают Mac OS и Chrome Book
  • Функциональные системы включают Ubuntu
  • У нас есть собственное __init__.pyна протяжении всех каталогов
  • Наш импорт работал на всех системах раньше, чем сегодня
  • При извлечении из github рабочие системы продолжают работать, а сломанные системы остаются сломанными.
  • Мы все работаем под python3.5.2

Таким образом, очевидный вопрос, что может быть причиной этой ошибки импорта?

1 ответ

Я никогда не ожидал, что код, который вы должны работать с командной строкой, которую вы показываете.

Когда вы запускаете скрипт по имени, Python помещает папку, в которой находится скрипт, в начале sys.path, который определяет, где он ищет модули для импорта. Для командной строки python3 ui/main.py, которые должны быть ui (или, может быть, эквивалентный абсолютный путь, я не уверен). Это не текущий рабочий каталог (который останется установленным в src).

Итак, настоящий вопрос в том, почему ваш код когда-либо работал? Я предполагаю, что некоторые из ваших машин имеют src добавлен в PYTHONPATH переменная среды, или, возможно, старая версия вашего pipeline пакет устанавливается где-то еще в пути поиска. Я понятия не имею, почему некоторые машины вдруг перестали бы работать.

В любом случае, я подозреваю, что лучшее решение этой проблемы - изменить способ запуска скрипта. Если ui должен быть пакетом, вы должны запустить ui/main.py с python3 -m ui.main,

Другие вопросы по тегам