Запуск команд Conda в NodeJS - PullRequest
       5

Запуск команд Conda в NodeJS

1 голос
/ 09 ноября 2019

Я не могу запустить команду Conda, используя exec с моим приложением NodeJS.

var conda_path = '~/miniconda3/bin/conda'

var cmd = conda_path + ' init bash & ' + conda_path + ' activate XYZ'
exec(command,
    function(error, stdout, stderr){

    }
);

Я получаю следующую ошибку:

/ bin / sh: /Users / username / Desktop / repos / project / XYZ: это каталог

CommandNotFoundError: Ваша оболочка не была правильно настроена для использования «conda activ». Чтобы инициализировать вашу оболочку, запустите

$ conda init <SHELL_NAME>

В настоящее время поддерживаются следующие оболочки: - bash - fish - tcsh - xonsh - zsh - powershell

См. 'Conda init --help' для получения дополнительной информации иoptions.

ВАЖНО: Вам может потребоваться закрыть и перезапустить вашу оболочку после запуска 'conda init'.

Я не могу найти онлайн информацию о запуске команд conda из приложения NodeJS.

Как я могу сделать эту работу?

Ответы [ 2 ]

0 голосов
/ 11 ноября 2019

conda run

Conda предоставляет команду conda run для выполнения программ или запуска сценариев в среде без необходимости ее активации вручную. В вашем случае вам нужна только одна команда, например,

var conda_exec = "C:\\anaconda\\Scripts\\conda.exe"
var env_name = "XYZ"
var sub_cmd = "XYZ arg1 <some_file_input> arg2 arg3 arg4 <some_file_output>"

var command = [conda_exec, 'run', '-n', env_name, sub_cmd].join(" ")

...

Имейте в виду, что conda run в настоящее время не возвращает результаты ввода / вывода до самого конца. Это означает, что вы не сможете измерить ход выполнения команды, а также что вам не следует использовать это, если вы ожидаете большой возврат (т. Е. Не поместится в памяти).


Предложение : рассмотрите вопрос о присвоении env XYZ_env или даже включите управление версиями (например, XYZ_v0_1_env), чтобы различать XYZ env и XYZ программу.

0 голосов
/ 10 ноября 2019

t, кажется, работает с использованием символа & для запуска нескольких команд.

Мне также нужно было указать путь к conda.sh, который находится внутри /users/username/miniconda??/etc/profile.d/.

Этот файлможно скопировать в любое место, например в корневую папку приложения NodeJS.

Вот рабочий код:

Windows 10

var commands = [
        'C:\\anaconda\\Scripts\\activate.bat C:\\anaconda',
        'conda activate XYZ_v0_1_env',
        'XYZ arg1  <some_file_input> arg2 arg3 arg4 <some_file_output>',
    ]

exec(commands.join(' & '),
    function(error, stdout, stderr){
        console.log(error)
        console.log(stdout)
        console.log(stderr)
    }
);

OSX

const exec = require('child_process').exec;

var conda_path = __dirname + '/conda.sh'

var commands = [
        conda_path,
        conda_path + ' init',
        conda_path + ' activate XYZ_v0_1_env',
        'XYZ arg1  <some_file_input> arg2 arg3 arg4 <some_file_output>',
    ]

exec(commands.join(' & '),
    function(error, stdout, stderr){
        console.log(error)
        console.log(stdout)
        console.log(stderr)
    }
);

РЕДАКТИРОВАТЬ: Использование spawn вместо exec для чтения результатов процесса в реальном времени, то есть для генерации хода выполнения:

var commands = [
        'C:\\anaconda\\Scripts\\activate.bat C:\\anaconda',
        'conda activate XYZ_v0_1_env',
        'XYZ arg1  <some_file_input> arg2 arg3 arg4 <some_file_output>',
    ]

var spawn_ = spawn(commands.join('&'), { shell: true });

spawn_.stdout.on('data', function (data) {
    //do something
});

spawn_.stderr.on('data', function (data) {
    //do something
});

spawn_.on('exit', function (code) {
    //do something
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...