Виртуальная среда 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.

Мои вопросы:

  1. Как запустить виртуальную среду Python перед конкретными тестами?
  2. Как мне настроить пользовательскую среду, которая будет использоваться в этих порожденных процессах?

2 ответа

Если вы используете плагин Python Nx , вы можете использовать@nxlv/python:run-commandsисполнитель.

Если нет, у вас есть 2 варианта:

  1. Вручную активируйте виртуальную среду в своем терминале перед запуском команд.
  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' })
Другие вопросы по тегам