【问题标题】:Running Conda commands in NodeJS在 NodeJS 中运行 Conda 命令
【发布时间】:2020-03-05 21:57:58
【问题描述】:

我无法在我的 NodeJS 应用中使用 exec 运行 Conda 命令。

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:您的 shell 未正确配置为 使用“康达激活”。要初始化你的 shell,运行

$ conda init <SHELL_NAME>

目前支持的 shell 有: - 重击 - 鱼 -tcsh - xonsh -zsh - 电源外壳

有关更多信息和选项,请参阅“conda init --help”。

重要提示:您可能需要在运行后关闭并重新启动 shell 'conda 初始化'。

我在网上找不到关于从 NodeJS 应用程序运行 conda 命令的相关信息。

我怎样才能做到这一点?

【问题讨论】:

  • 如果您需要在 Conda 环境中运行命令或脚本,请考虑使用 conda run as shown in this answer,这样可以避免手动激活。如果您尝试以编程方式操作 Conda 环境,那么我想那是另一回事了。
  • 我可能会尝试一下。我想出了一个可行的解决方案。
  • 现在我看到了你的命令,是的,你绝对应该切换到conda run。此外,conda init 实际上只意味着运行一次,并且具有编辑 shell 初始化脚本的用户级副作用 - 幸运的是它是幂等的,但在这里很浪费。您实际上应该查看它生成的代码,以了解如何初始化 shell 会话。

标签: node.js shell conda


【解决方案1】:

t 似乎可以使用&amp; 字符来运行多个命令。

我还需要指定位于/users/username/miniconda??/etc/profile.d/ 内的conda.sh 的路径。

此文件可以复制到任何位置,例如您的 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
});

【讨论】:

    【解决方案2】:

    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 目前直到最后才返回 I/O 结果。这意味着您将无法测量执行命令的进度,并且如果您期望获得较大的回报(即,不适合内存),则不应使用它。


    建议:考虑将环境命名为XYZ_env,甚至包括版本控制(例如,XYZ_v0_1_env),以便区分XYZ 环境和XYZ 程序。

    【讨论】:

    • 很好的答案。尽管由于它的多功能性,我很遗憾将我自己的答案标记为正确。感谢您提供环境命名建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-12
    • 1970-01-01
    • 1970-01-01
    • 2016-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多