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
,