当前位置: 首页 > 知识库问答 >
问题:

无法从子流程中激活Conda环境

蓬长恨
2023-03-14

我正在构建一个Electron应用程序(运行一个Angular应用程序),它充当下面python程序的用户界面。

python程序使用蟒蛇进行包管理(我使用迷你康达进行开发)。

当应用程序启动时,它检查所需的< code>conda环境是否存在,如果不存在,则创建它。

以下代码是负责管理python程序的服务Service的一部分。

public doEnvironmentSetup() {
    let stdOutSub = new Subject<string>();
    let stdErrSub = new Subject<string>();
    let completeSubject = new Subject<string>();
    this.runningSetup = true;

    const TEMP_ENV_FILE = join(tmpdir(), "env.yml");

    return Promise.resolve()
      .then(() => {

        // Copy packaged environment.yml to TEMP_ENV_FILE

      })
      .then(() => this.electron.getApplicationStoragePath())
      .then((stor) => {

        setTimeout(() => {

          let runProcess = this.electron.childProcess.spawn("conda", ["env", "create", "--file", TEMP_ENV_FILE, "--name", CONDA_ENV_NAME], {
            cwd: stor
          });

          const stdOutReaderInterface = createInterface(runProcess.stdout);
          const stdErrReaderInterface = createInterface(runProcess.stderr);

          stdOutReaderInterface.on('line', (line) => {
            stdOutSub.next(line);
          });

          stdErrReaderInterface.on('line', (line) => {
            stdErrSub.next(line);
          });

          runProcess.on('close', (code: number) => {
            this.electron.fs.unlinkSync(TEMP_ENV_FILE);
            this.runningSetup = false;
            completeSubject.next("");
          });

        }, 2000);

        return {
          stdOut: stdOutSub,
          stdErr: stdErrSub,
          onComplete: completeSubject
        };

      });

  }

现在,当我需要运行实际的python代码时,运行的代码段是(没有给出整个东西,因为它对于我们在这里的目的来说太长了):

        execCmd.push(
          `conda init ${this.electron.os.platform() === "win32" ? "powershell" : "bash"}`,
          `conda activate ${CONDA_ENV_NAME}`,
          // long python spawn command
          `conda deactivate`,
        )

        setTimeout(() => {

          logLineSubject.next({ out: "--- Setting up Execution Environment ---", err: "" });

          logLineSubject.next({ out: `Running in ${dir}`, err: "" });

          const cmd = execCmd.join(" && ");

          let runProcess = this.electron.childProcess.spawn(cmd, {
            detached: false,
            windowsHide: true,
            cwd: cwd,
            shell: this.getShell()
          });

          const stdOutInterface = createInterface(runProcess.stdout);
          const stdErrInterface = createInterface(runProcess.stderr);

          stdOutInterface.on('line', (line) => {
            // get this line back to the component
          });

          stdErrInterface.on('line', (line) => {
            // get this line back to the component
          });

          runProcess.on("error", (err) => {
            // get this back to the component
          });

          runProcess.on('close', (code: number) => {
            // get this line back to the component
          });

        }, 1000);

其中,获取外壳定义为:

private getShell() {
  return process.env[this.electron.os.platform() === "win32" ? "COMSPEC" : "SHELL"];
}

但是,每当我尝试运行它时,它都会返回:

CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'.
To initialize your shell, run
    $ conda init <SHELL_NAME>
blah blah blah ...

当我尝试使用源代码激活 ${CONDA_ENV_NAME} 时,它会返回:

/bin/bash: activate: No such file or directory

我不知道我做错了什么。有人能给我指出正确的方向吗?

PS:它适用于source$(conda info--root)/etc/profile. d/conda.sh,但我不能真正使用它,因为我也需要支持Windows!

免责声明:我是蟒蛇/蟒蛇的新手

共有3个答案

司徒高寒
2023-03-14

更新:

我指的是<代码>

const execPath = path.dirname(process.execPath)
// silent install Miniconda3 to this path (electron-forge resources)
const condaPath = [execPath, "resources", "Miniconda3"].join(path.sep)
const conda = [condaPath, "condabin", "conda.bat"].join(path.sep)
cmd = `${condaPath} activate ${venvPath} & python ${filename} ${arg1} ${arg2}`

我也在找这个,我就在前完成了

我有相同的设置,使用电子和康达的UI与蟒蛇回来交谈。这在我的节点中:

spawn(
  `conda activate ${name} & python ${filename} ${arg1} ${arg2}`,
  { shell: true }
);

我让它也能传输标准输入/输出。确定壳是真的。

席烨
2023-03-14

主要问题是您的shell(本例中为CMD)没有配置为处理conda。您必须通过向path环境变量提供Miniconda/Anaconda,将其添加到系统路径中。

检查此StackOverflow问题以了解如何操作。

爱炯
2023-03-14

我不确定在Windows强盾中需要运行什么,但对于bash,你需要运行脚本,该脚本将conda init配置为在启动时运行,而不是conda init。那是

miniconda3/etc/profile.d/conda.sh

所以应该是这样的

execCmd.push(
    `. ${CONDA_ROOT}/etc/profile.d/conda.sh`,
    `conda activate ${CONDA_ENV_NAME}`,
    // long python spawn command
     `conda deactivate`,
)

我怀疑Windows案例正在运行。< code>condabin目录中的bat或. ps1文件

或者,如果定义了conda并且您有一个Python脚本(例如,script.py),那么您可能可以使用conda run,例如,

execCmd.push(
    `conda run -n ${CONDA_ENV_NAME} python script.py`
)

这可能会跨平台工作。请注意,< code>conda run最近才添加了对交互式I/O的支持,并且必须使用< code> - live-stream标志启用它(参见4.9.0版本说明)。否则,它只是缓冲所有命中stdout/stderr的数据,直到进程退出才返回。

 类似资料:
  • 问题内容: 我写了一个python程序。如果我有一个像这样的shebang: 然后使用以下命令使文件可执行: 我可以这样运行程序: 这是问题。我使用conda虚拟环境。当我运行上述程序时,系统会创建一个无法识别活动环境的子外壳: 但是如果我这样做的话… 如何指定在子Shell中使用的正确环境?可能吗?我希望省去输入六个字符串的麻烦。 另一篇文章,在conda托管环境中的Shebangs,简短地谈到

  • 我正在尝试调试一些C++代码,这些代码链接到安装在单独的Conda环境中的库。但是,'tasks.json'文件总是检查基环境中的库,而不是我打算使用的环境中的库。某些错误消息片段如屏幕截图所示。 有人能建议我如何在调试器的构建过程之前激活环境吗?

  • 不熟悉在虚拟环境中运行Python,会弄乱Django,无法激活虚拟环境。 在过去的4个小时里,试图在本地终端/VS代码上激活虚拟环境(venv),但运气不佳。 避免了“sudo pip install virtualenv”,因为我试图避免以root用户身份安装和使用不同的目录路径等。 使用缓存的virtualenv-20.0.31-py2.py3-none-any.whl(4.9 MB)收集v

  • 问题内容: 我需要在我们的jenkins服务器(在Windows上运行)上使用特定的conda环境运行jenkins构建。我认为这和运行一样容易: 但这似乎导致构建甚至在脚本启动之前退出。这是jenkins控制台日志: 如果删除激活行,则python脚本可以正常执行。 仅供参考,我正在运行的脚本: 有人知道发生了什么吗?我应该直接调用相关的python可执行文件吗? 问题答案: 使用以防止激活从它

  • 问题内容: 因此,我不断在多个服务器上收到此烦人的错误(它是一个警告,因此我将忽略它,但我需要该功能) 警告:curl_setopt()[function.curl- setopt]:启用safe_mode或在第56行的/home/xxx/public_html/xxx.php中设置了open_basedir时,无法激活CURLOPT_FOLLOWLOCATION 我将如何通过SSH解决此问题?

  • 问题内容: 我正在创建Django Web应用程序,并使用Conda来管理所需的程序包和虚拟环境。我想在激活环境后立即设置环境变量(Django设置位置)。它还应该将当前目录更改为我的项目目录。 我以前使用virtualenvwrapper,只是将命令添加到了postactivate脚本中。 如何使用Conda实现此目的? 问题答案: 自conda v3.8起(在询问此问题之后),该功能已可用。激