Как вы предпочитаете один пакет, если оба пакета имеют одно и то же имя модуля?

#python #import #namespaces #python-module

Вопрос:

Итак, два пакета имеют одинаковое имя модуля, docopt и docopt-ng оба экспортируют docopt — когда есть зависимость, например

 pipenv install pip-upgrader docopt-ng
 

При попытке импортировать

 import docopt
 

Вы получаете один из двух, но не тот, который я хочу сегодня. Есть ли уловка, чтобы заставить импортера импортировать другой модуль (тот, что в docopt-ng)?

Вещи, которые не сработали:

 $ python -c "from docopt-ng import docopt; print(docopt.__file__)"

  File "<string>", line 1
    from docopt-ng import docopt; print(docopt.__file__)
 

В .NET это решается с помощью имен, состоящих из четырех частей.

Комментарии:

1. вы пробовали from docopt-ng import docopt ?

2. Где установлены два пакета? Поскольку имя импорта соответствует имени каталога, они не могут находиться в одном родительском каталоге.

3. @DickFox, я думаю, дело в том, что OP хочет использовать pip-upgrader , что зависит от docopt . Но OP хочет использовать docopt-ng как прямую зависимость.

4. Я полагаю, что они оба устанавливают a docopt.py , site-packages поэтому один перезаписывает другой. Это проблема установки, поэтому нет способа импортировать оба. Вы можете рассмотреть возможность разветвления jazzband/docopt-ng и изменить процесс установки, а затем установить свой собственный форк, используя pipenv from git.

5. @about14sheep Это недопустимый импорт, поскольку он содержит дефис.

Ответ №1:

Хорошо, я понял.

  1. Используйте --target флаг, чтобы указать местоположение для установки версии docopt-ng в местоположение, которое не конфликтует с другим пакетом.
  2. Добавьте это местоположение в свою PYTHONPATH переменную env перед вашим обычным каталогом пакетов.
 (docopt) % pip install pip-upgrader
(docopt) % mkdir shims
(docopt) % pip install --target /Users/dickfox/docopt/shims docopt-ng
(docopt) % export PYTHONPATH='/Users/dickfox/docopt/shims'
(docopt) % python
>>> import docopt
>>> docopt.__file__ 
'/Users/dickfox/docopt/shims/docopt.py'
 

Чтобы использовать оригинальную версию:

 (docopt) % python
>>> import sys
>>> sys.path
['', '/Users/dickfox/docopt/shims', ETC...]
>>> del sys.path[1]
>>> import docopt
>>> docopt.__file__
'/Users/dickfox/lib/python3.8/site-packages/docopt.py'
 

У меня не получилось вставить специальное место установки, используя sys.path.insert , как только я уже запустил python. Мне пришлось использовать переменную env.