#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:
Хорошо, я понял.
- Используйте
--target
флаг, чтобы указать местоположение для установки версии docopt-ng в местоположение, которое не конфликтует с другим пакетом. - Добавьте это местоположение в свою
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.