Виртуальная среда Python в монорепозитории NX
Я использую монорепозиторий NX для одного из своих крупных проектов JavaScript, и одна его часть зависит от внешнего проекта, который создает собственную виртуальную среду Python. Части моего кода nodejs выполняют команды Python, а затем извлекают данные, необходимые для остальной части процесса сборки JS.
Для запуска сценариев или тестов NX необходимо включить виртуальную среду, но проблема в том, что NX порождает свои собственные процессы, изолированные от остальной части операционной системы.
Если я попытаюсь добавить скрипт NPM, который запускает virtualenvconda activate testenv
сnx:run-script
"virtualenv-conda": {
"executor": "nx:run-script",
"options": {
"script": "venv-conda"
}
}
или установите его с помощьюnx:run-commands
с
"virtualenv-conda": {
"executor": "nx:run-commands",
"options": {
"commands": [
"conda activate testenv"
],
"parallel": false
}
}
Я получаю следующую ошибку:
CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'.
To initialize your shell, run
$ conda init <SHELL_NAME>
Currently supported shells are:
- bash
- fish
- tcsh
- xonsh
- zsh
- powershell
Я использую ZSH на MacOS.
Мои вопросы:
- Как запустить виртуальную среду Python перед конкретными тестами?
- Как мне настроить пользовательскую среду, которая будет использоваться в этих порожденных процессах?
2 ответа
Если вы используете плагин Python Nx , вы можете использовать@nxlv/python:run-commands
исполнитель.
Если нет, у вас есть 2 варианта:
- Вручную активируйте виртуальную среду в своем терминале перед запуском команд.
- Используйте экзекьютор и для каждой команды добавьте
source ./.venv/bin/activate ; your command
Нксnx:run-commands
Исполнитель запускает каждую команду в отдельном процессе, поэтому вам необходимо активировать виртуальную среду для каждой выполняемой команды.
Самое простое решение, которое я смог найти, - это установить переменную env, которая приведет к виртуальной среде.bin
папка (в системах nix) илиScripts
в Windows, а затем добавляйте этот конкретный путь ко всем командам.
Короче говоря, это просто идея, если кому-то еще нужно разработать свои собственные решения.
import { execSync } from 'child_process'
const pythonPath = '/absolute/path/to/specific/python/venv/bin'
const pyCmd = 'some_python_command'
execSync(pythonPath + ' ' + pyCmd, { stdio: 'pipe' })