Я заставил иметь две несовместимые версии пакета python: более свежую версию с хорошим cli и более старую версию с python API, используемую сторонним инструментом оркестрации, который также является пакетом python с самим cli. Поэтому мне нужно иметь две отдельные виртуальные среды. Также я хочу запустить интерпретатор python из моей текущей одноразовой виртуальной среды (третья).
Все три команды (пакет cli, инструмент оркестрации cli и интерпретатор python) будут вызываться от пользователя и должны быть доступны по желанию без активации / изменения каталога работы или других наложенных магических заклинаний. Также я не хочу баловаться с содержимым сценария cli, поэтому пусть он будет доступен только для чтения / запуска для целей этого вопроса.
С моей точки зрения, есть несколько вариантов достижения желаемого поведения.
A . добавить в мою .bash_profile
строку сценария
export PATH=venv_throwaway/bin:venv_cli/bin:venv_orchestration_tool/bin:$PATH
Это решение требует ручного шага для каждого инструмента, который я хочу использовать таким образом. Также это решение страдает от проблемы перекрытия пространства имен. Каталог bin
для каждого нового клиента, который я хочу использовать таким образом, должен быть строго помещен после venv_throwaway/bin
хотя бы потому, что в противном случае new_cli/bin/python
будет предшествовать моему venv_throwaway/bin/python
интерпретатору. Более того, если некоторые из других CLI имеют общие зависимости, которые несовместимы, то я должен грубо заставить корректную последовательность размещения путей, что является обременительным.
B . Исполняемый файл Symlink для /usr/local/bin
для каждого инструмента, который я хочу использовать таким образом. Это решение почти идеально, за исключением того, что требует ручного шага.
B '. Вызовите cli с полным путем venv к исполняемому файлу (например, ~/.virtualenvs/awscli/bin/aws
). Выглядит почти как опция B , особенно если я сделаю псевдонимы, чтобы сократить пути вен.
C . Сделайте мой собственный пакет Python my_awesome_cli_installer , который автоматизирует ручные шаги с B . Почти идеальный, за исключением того, что он страдает от NIH проблемы.
Есть ли другой способ добиться желаемого поведения? Какой вариант ( A , B или C ) мне следует использовать?