You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask接口调用Conda虚拟环境脚本失败:无兼容Shell错误排查

问题描述

我用conda创建了名为py311的虚拟环境,尝试通过Flask接口调用该环境中的Python脚本,但代码无法执行;而在终端进入该虚拟环境后运行脚本,可在1分钟内完成。

实现代码

import flask
import requests
import json
import urllib3
import urllib.parse
from flask import request, jsonify,make_response

import subprocess

app = flask.Flask(__name__)
app.config["DEBUG"] = True


@app.route('/vl/<startdate>/<enddate>', methods=['GET'])
def gen2(startdate, enddate):
     result_err={}
     k=subprocess.getoutput(' /home/azureuser/anaconda3/bin/conda run -n py311 && python  Ekal_Visit_Listing_Between_Dates_A.py ' +  startdate  +"  "+enddate)
     result_err['fname']=k
     return make_response(jsonify(result_err),200)

if __name__ == "__main__":
    app.run(host='0.0.0.0')

报错信息

浏览器与curl调用均返回错误,核心报错为:Exception: No compatible shell found!,完整错误报告如下:

{"fname": "\n# >>>>>>>>>>>>>>>>>>>>>> ERROR REPORT <<<<<<<<<<<<<<<<<<<<<<\n\n    Traceback (most recent call last):\n      File \"/home/azureuser/anaconda3/lib/python3.11/site-packages/conda/exception_handler.py\", line 17, in __call__\n        return func(*args, **kwargs)\n               ^^^^^^^^^^^^^^^^^^^^^\n      File \"/home/azureuser/anaconda3/lib/python3.11/site-packages/conda/cli/main.py\", line 83, in main_subshell\n        exit_code = do_call(args, parser)\n                    ^^^^^^^^^^^^^^^^^^^^^\n      File \"/home/azureuser/anaconda3/lib/python3.11/site-packages/conda/cli/conda_argparse.py\", line 196, in do_call\n        result = getattr(module, func_name)(args, parser)\n                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n      File \"/home/azureuser/anaconda3/lib/python3.11/site-packages/conda/cli/main_run.py\", line 96, in execute\n        script, command = wrap_subprocess_call(\n                          ^^^^^^^^^^^^^^^^^^^^^\n      File \"/home/azureuser/anaconda3/lib/python3.11/site-packages/conda/utils.py\", line 448, in wrap_subprocess_call\n        raise Exception(\"No compatible shell found!\")\n    Exception: No compatible shell found!\n\n`$ /home/azureuser/anaconda3/bin/conda run -n py311`\n\n  environment variables:\n                 CIO_TEST=<not set>\n               CONDA_ROOT=/home/azureuser/anaconda3\n           CURL_CA_BUNDLE=<not set>\n               LD_PRELOAD=<not set>\n                     PATH=/home/azureuser/anaconda3/envs/py311/bin\n       REQUESTS_CA_BUNDLE=<not set>\n            SSL_CERT_FILE=<not set>\n\n     active environment : None\n       user config file : /var/www/.condarc\n populated config files : \n          conda version : 24.1.2\n    conda-build version : 24.1.2\n         python version : 3.11.7.final.0\n                 solver : libmamba (default)\n       virtual packages : __archspec=1=broadwell\n                          __conda=24.1.2=0\n                          __glibc=2.27=0\n                          __linux=5.4.0=0\n                          __unix=0=0\n       base environment : /home/azureuser/anaconda3  (read only)\n      conda av data dir : /home/azureuser/anaconda3/etc/conda\n  conda av metadata url : None\n           channel URLs : https://repo.anaconda.com/pkgs/main/linux-64\n                          https://repo.anaconda.com/pkgs/main/noarch\n                          https://repo.anaconda.com/pkgs/r/linux-64\n                          https://repo.anaconda.com/pkgs/r/noarch\n          package cache : /home/azureuser/anaconda3/pkgs\n                          /var/www/.conda/pkgs\n       envs directories : /var/www/.conda/envs\n                          /home/azureuser/anaconda3/envs\n               platform : linux-64\n             user-agent : conda/24.1.2 requests/2.31.0 CPython/3.11.7 Linux/5.4.0-1109-azure ubuntu/18.04.5 glibc/2.27 solver/libmamba conda-libmamba-solver/24.1.0 libmambapy/1.5.6\n                UID:GID : 33:33\n             netrc file : None\n           offline mode : False\n\n\nAn unexpected error has occurred. Conda has prepared the above report.\nIf you suspect this error is being caused by a malfunctioning plugin,\nconsider using the --no-plugins option to turn off plugins.\n\nExample: conda --no-plugins install <package>\n\nAlternatively, you can set the CONDA_NO_PLUGINS environment variable on\nthe command line to run the command without plugins enabled.\n\nExample: CONDA_NO_PLUGINS=true conda install <package>\n"}

终端正常运行示例

(base) myhost:~$ source activate py311
(py311) myhost:~$ python script.py '2024-01-01' '2024-03-01'
myurl/reports/19_03_2024_10_27_56_product_listing.xlsx
解决方法

出现No compatible shell found!错误的核心原因是Flask运行时的环境缺少合适的shell支持,或者conda run的调用格式有误。以下是几种可行的解决方案:

方案一:直接调用虚拟环境的Python解释器

绕过conda的环境切换逻辑,直接使用py311环境下的Python路径执行脚本,这是最简洁的解决方式:
修改Flask代码中的subprocess调用:

k = subprocess.getoutput('/home/azureuser/anaconda3/envs/py311/bin/python Ekal_Visit_Listing_Between_Dates_A.py ' + startdate + ' ' + enddate)

方案二:修正conda run调用格式并指定shell

如果必须使用conda run,需要注意两点:一是conda run的正确格式是直接跟随要执行的命令(无需&&),二是显式指定兼容的shell:
修改subprocess调用为:

cmd = '/home/azureuser/anaconda3/bin/conda run -n py311 python Ekal_Visit_Listing_Between_Dates_A.py ' + startdate + ' ' + enddate
k = subprocess.getoutput(cmd, shell=True, executable='/bin/bash')

方案三:配置Flask运行用户的环境

从报错信息可知,Flask运行用户是UID:33(通常为www-data),该用户的环境可能未配置bash支持:

  1. 修改www-data的默认shell为bash:
sudo chsh -s /bin/bash www-data
  1. 在subprocess调用中传递必要的环境变量:
import os
env = os.environ.copy()
env['SHELL'] = '/bin/bash'
env['HOME'] = '/home/azureuser'  # 替换为conda所属用户的home目录
cmd = '/home/azureuser/anaconda3/bin/conda run -n py311 python Ekal_Visit_Listing_Between_Dates_A.py ' + startdate + ' ' + enddate
k = subprocess.getoutput(cmd, env=env, shell=True)

内容的提问来源于stack exchange,提问作者Satya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 11:04:53