conda激活py36环境后运行flask调用错误Python版本问题求助
我尝试查找过类似的解决方案,但都不适用于我的情况。
我有一个运行python3.6的环境名为py36,我执行conda activate py36激活环境后,运行如下命令启动flask:
export FLASK_APP=main.py flask run --port=5050
随后收到如下报错:
Traceback (most recent call last): File "/Users/USERNAME/anaconda/bin/flask", line 6, in <module> sys.exit(flask.cli.main()) File "/Users/USERNAME/anaconda/lib/python3.5/site-packages/flask/cli.py", line 513, in main cli.main(args=args, prog_name=name) File "/Users/USERNAME/anaconda/lib/python3.5/site-packages/flask/cli.py", line 380, in main return AppGroup.main(self, *args, **kwargs) File "/Users/USERNAME/anaconda/lib/python3.5/site-packages/click/core.py", line 697, in main rv = self.invoke(ctx) File "/Users/USERNAME/anaconda/lib/python3.5/site-packages/click/core.py", line 1066, in invoke return _process_result(sub_ctx.command.invoke(sub_ctx)) File "/Users/USERNAME/anaconda/lib/python3.5/site-packages/click/core.py", line 895, in invoke return ctx.invoke(self.callback, **ctx.params) File "/Users/USERNAME/anaconda/lib/python3.5/site-packages/click/core.py", line 535, in invoke return callback(*args, **kwargs) File "/Users/USERNAME/anaconda/lib/python3.5/site-packages/click/decorators.py", line 64, in new_func return ctx.invoke(f, obj, *args[1:], **kwargs) File "/Users/USERNAME/anaconda/lib/python3.5/site-packages/click/core.py", line 535, in invoke return callback(*args, **kwargs) File "/Users/USERNAME/anaconda/lib/python3.5/site-packages/flask/cli.py", line 423, in run_command app = DispatchingApp(info.load_app, use_eager_loading=eager_loading) File "/Users/USERNAME/anaconda/lib/python3.5/site-packages/flask/cli.py", line 152, in __init__ self._load_unlocked() File "/Users/USERNAME/anaconda/lib/python3.5/site-packages/flask/cli.py", line 176, in _load_unlocked self._app = rv = self.loader() File "/Users/USERNAME/anaconda/lib/python3.5/site-packages/flask/cli.py", line 237, in load_app rv = locate_app(self.app_import_path) File "/Users/USERNAME/anaconda/lib/python3.5/site-packages/flask/cli.py", line 90, in locate_app __import__(module) File "/Users/USERNAME/Documents/Google_Drive/Projects/project/main.py", line 3, in <module> import MySQLdb ImportError: No module named 'MySQLdb'
问题的根源并不是未安装'MySQLdb',该依赖已经在py36环境中安装完成。
我执行conda list得到如下输出:
mysql-connector-c 6.1.11 h42a37c1_0 mysqlclient 1.4.6 py36h0a44026_0
这可以证明mysql相关依赖已经在当前环境安装完成。
同时我执行python得到的输出如下:
$ python Python 3.6.1 |Anaconda custom (64-bit)| (default, May 11 2017, 13:04:09) [GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>>
这证明当前环境的默认python版本为3.6。
可见所有配置都应该使用python3.6,但报错信息显示代码实际调用了python3.5运行,我的代码没有指定python版本的前缀或头声明。
下面是我的main.py文件的开头部分代码:
from flask import Flask, request, render_template, jsonify from flask_cors import CORS from flask_pymongo import PyMongo import MySQLdb import json import math import pandas as pd import numpy as np from collections import OrderedDict import pprint import sys app = Flask(__name__) cors = CORS(app, resources={r"/*": {"origins": "*"}})
也就是说,本应独立运行python3.6版本的conda环境出现了激活后Python版本不一致的异常。我不敢随意修改环境路径,执行echo $PATH得到的输出如下:
>>>echo $PATH /Users/USERNAME/anaconda/envs/py36/bin:/usr/local/opt/openssl/bin:/usr/local/opt/openssl/bin:/usr/local/opt/openssl/bin:/usr/local/opt/openssl/bin:/usr/local/fsl/bin:/Users/USERNAME/anaconda/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/usr/local/git/bin:/Library/Frameworks/Mono.framework/Versions/Current/Commands
我目前只能通过如下临时方法解决问题:
conda activate /Users/USERNAME/anaconda pip install pymysql
但这只是权宜之计,没有解决根本问题,因为我激活py36环境时并不想使用base环境的依赖。
恳请各位帮忙定位问题,十分感谢!
问题核心是你激活的py36环境内没有安装flask,执行flask命令时,系统在py36的bin目录下找不到对应执行文件,就会向后遍历PATH路径,最终调用了base环境下安装的flask,自然会使用base环境的Python3.5和对应的依赖库。
修复步骤如下:
- 执行
conda activate py36确保切换到目标环境 - 执行
conda install flask或者pip install flask在py36环境内安装flask - 安装完成后执行
which flask验证路径,正常会返回/Users/USERNAME/anaconda/envs/py36/bin/flask,说明调用的是py36环境内的flask - 重新执行
flask run --port=5050即可正常运行
这个方案完全基于py36环境的依赖,不会影响base环境的配置,也不需要修改系统PATH。
内容的提问来源于stack exchange,提问作者appleslice

