Как игнорировать модуль python в ~ / .local / lib / python2.7 / site-packages?

У меня есть пакет python dateutil в каталоге ~/.local/lib/python2.7/site-packages, а также один в /usr/lib/python2.7/dist-packages/dateutil. Когда я пытаюсь запустить исполняемый файл из kalibr (инструмент калибровки камеры, я загрузил CDE), rrule.py из пакета dateutil в ~/.local/lib/python2.7/site-packages выдает ошибку «ImportError: Нет модуля с именем фракции». Я могу запустить kalibr, удалив указанный пакет dateutil (так как он использует пакет из /usr/lib/python2.7/dist-packages/dateutil), но я боюсь, что это повлияет на другие проекты.

Итак, я решил, что основная проблема здесь в том, что python предпочитает пакет dateutil в ~/.local/lib/python2.7/site-packages пакету в /usr/lib/python2.7/dist-packages/dateutil.

Как я могу заставить питон предпочесть последний?

(Я использую Ubuntu 16.04)


person takahashi    schedule 28.12.2016    source источник
comment
вы пробовали импортировать fractions из консоли Python? потому что он находится в библиотеке Python. Должно работать отовсюду.   -  person Jean-François Fabre    schedule 28.12.2016
comment
проблема в том, что я запускаю исполняемый файл, который вызывает скрипт python .. поэтому я не могу использовать консоль python   -  person takahashi    schedule 28.12.2016
comment
@takahashi ваш PYTHONPATH должен быть таким же, если ваш исполняемый файл имеет ту же среду, что и у вас при запуске REPL, поэтому не имеет значения, используете вы REPL или нет. Мне очень странно, что ваши зависимости не могут импортировать fractions. У них должна быть возможность, особенно после того, как удаление вашей локальной установки dateutil заставило вас использовать стандартную, что указывает на то, что ваша PYTHONPATH должна быть правильной. Вы должны import fractions затем help(fractions), чтобы узнать, какую версию REPL вы используете.   -  person 2rs2ts    schedule 28.12.2016


Ответы (2)


Я не думаю, что есть способ выбирать, из какого каталога загружать пакеты для каждого пакета, но вы можете изменить порядок, в котором Python ищет пакеты. Порядок отражен в sys.path. Путь поиска пакетов по умолчанию зависит от файлов для конкретного сайта, но в основном это:

  1. Текущий каталог.
  2. Каталоги, перечисленные в переменной среды PYTHONPATH.
  3. Стандартная библиотека, поставляемая с самим Python.
  4. Каталог dist-packages в ~/.local (каталог пакетов сайтов пользователей) , куда pip install --user устанавливает вещи. Вы можете изменить путь к этому каталогу, установив переменную среды _6 _ и полностью отключите его, установив для PYTHONNOUSERSITE непустое значение ценить.
  5. Каталог dist-packages в /usr/local, куда pip install устанавливает вещи.

Поэтому, если сначала необходимо пройти по каталогу, вы можете поместить его в PYTHONPATH. В вашем случае есть большая вероятность, что вы можете просто отключить ~/.local, чтобы запустить kalibr.

env PYTHONNOUSERSITE=1 kalibr

Чтобы увидеть путь поиска пакета, запустите

python -m site

(Все это относится и к Python3.)

(Как правило, правильно отдавать предпочтение пакетам под ~/.local пакетам под /usr. В идеале пакеты всегда будут обратно совместимы, и если вы столкнетесь с несовместимостью, вы просто установите последнюю версию под ~/.local с pip install --user. Но в реальной мир, это не всегда получается.)

person Gilles 'SO- stop being evil'    schedule 25.06.2019

См. ответы здесь об изменении PYTHONPATH и порядка поиска модулей по умолчанию. Вы также должны проверить свой сценарий, чтобы увидеть, изменяет ли он PYTHONPATH или sys.path.

person yorodm    schedule 28.12.2016