如何在Popen启动的Shell中完成conda init并激活环境执行脚本?
问题:Qt中Popen执行conda activate命令失败
我在Qt中尝试使用Popen执行Shell命令,想要激活名为alphapose的conda虚拟环境并运行inference.py,代码如下:
QString srtttt = "conda activate alphapose;cd;cd AlphaPose-pytorch-1.11 ;python scripts/demo_inference.py "; FILE* fp = popen(srtttt.toLocal8Bit().data(), "r");
但出现如下错误:
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 See 'conda init --help' for more information and options.
补充说明:普通终端中可正常运行conda activate等命令,仅Popen启动的Shell无法正常初始化;在该Shell中执行conda env list或conda能得到正确输出,但执行conda init会显示no change and no action taking。
解决方案
方案1:使用conda run直接指定环境执行命令
不需要激活环境,直接用conda run命令指定目标环境运行脚本,避免shell初始化问题。修改后的命令如下(注意替换为你的AlphaPose绝对路径):
QString srtttt = "conda run -n alphapose python /absolute/path/to/AlphaPose-pytorch-1.11/scripts/demo_inference.py"; FILE* fp = popen(srtttt.toLocal8Bit().data(), "r");
优点:无需处理shell初始化,命令简洁可靠。
方案2:手动加载conda初始化脚本
Popen启动的是非交互式shell,不会自动加载conda的初始化配置,可在命令开头手动source初始化脚本:
// 替换为你的conda安装路径,比如anaconda3/miniconda3 QString srtttt = "source ~/miniconda3/etc/profile.d/conda.sh; conda activate alphapose; cd /absolute/path/to/AlphaPose-pytorch-1.11; python scripts/demo_inference.py"; FILE* fp = popen(srtttt.toLocal8Bit().data(), "r");
原理:手动加载conda的环境配置脚本,让shell识别conda activate命令。
方案3:启动交互式shell执行命令
强制Popen启动交互式bash,使其自动加载初始化配置:
QString srtttt = "bash -i -c \"conda activate alphapose; cd /absolute/path/to/AlphaPose-pytorch-1.11; python scripts/demo_inference.py\""; FILE* fp = popen(srtttt.toLocal8Bit().data(), "r");
注意:交互式shell可能会输出额外的初始化信息,需处理输出内容。
内容的提问来源于stack exchange,提问作者Alan810
相关产品推荐
相关产品推荐

