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支持:
- 修改www-data的默认shell为bash:
sudo chsh -s /bin/bash www-data
- 在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
相关产品推荐
相关产品推荐

