我正在构建一个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!
免责声明:我是蟒蛇
/蟒蛇的新手
。
更新:
我指的是<代码>
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 }
);
我让它也能传输标准输入/输出。确定壳是真的。
主要问题是您的shell(本例中为CMD)没有配置为处理conda。您必须通过向path
环境变量提供Miniconda/Anaconda,将其添加到系统路径中。
检查此StackOverflow问题以了解如何操作。
我不确定在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起(在询问此问题之后),该功能已可用。激