Python Windows 环境 sqlalchemy 缺少 No module named 'sasl'

一、hive连接代码(windows)

hive.py

from pyhive import hive
import sqlalchemy as sa
from sqlalchemy import create_engine
import pandas as pd

def hive_cli(username, host, port, database):
    conn = hive.connect(host=host, port=port, username=username, database=database)
    return conn

def hive_engine(username, password, host, port, database):
    engine = create_engine('hive://{}:{}@{}:{}/{}?auth=LDAP'.format(username, password, host, port, database))
    return engine

def get_table_data(engine, table_name, offset=0, limit=10, order_by=None) -> pd.DataFrame:
    table = sa.Table(table_name, sa.MetaData(), autoload=True, autoload_with=engine)
    if order_by is not None and order_by != "":
        data = pd.read_sql(table.select().order_by(order_by).offset(offset).limit(limit), engine)
    else:
        data = pd.read_sql(table.select().offset(offset).limit(limit), engine)
    return data

def save_data(engine, table_name, data, if_exists="replace"):
    result = data.to_sql(table_name, con=engine, index=False, if_exists=if_exists, method="multi")
    return result

def main():
    username = "hive"
    password = "hive"
    host = "192.168.1.124"
    port = 10000
    database = 'test_db'

    print("链接数据库...")
    engine = hive_engine(username, password, host, port, database)
    print("数据库已连接...")

    # 获取数据
    res = get_table_data(engine, 'fanqi_train_tbl', 0, 20)
    print(res)

if __name__ == '__main__':
    main()

问题①缺少依赖:
执行报错:

C:\Users\homay\anaconda3\envs\myenv\python.exe C:\Work\Code\xxx\common\client\hive.py 
链接数据库...
数据库已连接...
Traceback (most recent call last):
  File "C:\Work\Code\menv\common\client\hive.py", line 46, in <module>
    main()
  File "C:\Work\Code\menvg\common\client\hive.py", line 42, in main
    res = get_table_data(engine, 'fanqi_train_tbl', 0, 20)
  File "C:\Work\Code\menv\common\client\hive.py", line 18, in get_table_data
    table = sa.Table(table_name, sa.MetaData(), autoload=True, autoload_with=engine)
  File "<string>", line 2, in __new__
  File "C:\Users\homay\anaconda3\envs\menv\lib\site-packages\sqlalchemy\util\deprecations.py", line 309, in warned
    return fn(*args, **kwargs)
  File "C:\Users\homay\anaconda3\envs\menv\lib\site-packages\sqlalchemy\sql\schema.py", line 616, in __new__
    metadata._remove_table(name, schema)
  File "C:\Users\homay\anaconda3\envs\mring\lib\site-packages\sqlalchemy\util\langhelpers.py", line 70, in __exit__
...
  File "C:\Users\homay\anaconda3\envs\mrg\lib\site-packages\pyhive\hive.py", line 152, in __init__
    import sasl
ModuleNotFoundError: No module named 'sasl'

Process finished with exit code 1

报错异常:

ModuleNotFoundError: No module named 'sasl'

file

查看当前安装的依赖包:

在当前的激活环境,然后查看 sasl 包是否安装好了,查看了下,没有安装好,再次安装一下,直接在pycharm进行安装。
file

pip install thrift
pip install sasl
pip install thrift-sasl
pip install thriftpy2

问题②:
安装好依赖之后,然后再执行脚本,又报这样的错误:
file

Could not start SASL: b'Error in sasl_client_start (-4) SASL(-4)

报错详细信息:

File "C:\Users\homay\anaconda3\envs\myenv\lib\site-packages\thrift_sasl\__init__.py", line 84, in open
    raise TTransportException(type=TTransportException.NOT_OPEN,
thrift.transport.TTransport.TTransportException: Could not start SASL: b'Error in sasl_client_start (-4) SASL(-4): no mechanism available: Unable to find a callback: 2'

发生这个错误最主要的原因是之所以pyhive无法链接hive库是因为,所引用的sasl无法初始化,在windows下,需要指定初始化时的dll库位置。

我的解决方法是:

第一步:
找到你python环境下的Library,找到bin目录下的sasls,找到 saslPLAIN.dll 文件:

我的环境是在 C:\Users\kaiyi\anaconda3\envs\myenv\Library\bin 目录下:
file

复制一下。

第二步:
在C盘下 创建 C:\CMU\bin\sasl2,在此目录下面拷贝 saslPLAIN.dll 文件,再尝试连接:
file

然后重新执行脚本,可以看到已经执行成功了,可以正常连接到Hive,并获取到了数据:
file

虚拟环境

创建虚拟环境:

conda create --name myenv

conda create --name myenv python=2.7

conda create --name myenv pytohon=2.7 numpy scipy

查看已有的虚拟环境,检测是否创建成功

conda env list 

激活虚拟环境

conda activate conda_name

如何解决‘CommandNotFoundError: Your shell has not been properly configured to use ‘conda activate’错误

其实这是初次使用Anaconda时,没有预先对命令行进行预载的结果。解决办法非常简单,只需根据Anaconda的提示运行对应的命令即可。

Windows:

conda init cmd.exe

Linux(使用bash):

conda init bash

总之,对于不同的命令行软件,只需要运行如Anaconda提示中的命令:

conda init {TERMINAL_TYPE}

就能够解决该报错问题。
http://www.1000zx.cn/it/5292.html

关闭虚拟环境:

conda deactivate

Linux环境

yum install cyrus-sasl-lib.x86_64
yum install cyrus-sasl-devel.x86_64
yum install libgsasl-devel.x86_64
yum install saslwrapper-devel.x86_64
sudo pip install sasl
sudo pip install thrift_sasl

二、Conda环境离线迁移

1、示例

1、创建环境
使用conda命令创建一个3.9.5的python环境。

conda create -n torch_paddle python=3.9.5

2、激活环境

conda activate torch_paddle

3、打包

conda pack -n torch_paddle -o torch_paddle.tar.gz

4、解包
创建torch_paddle文件夹

mkdir torch_paddle
tar -zxvf torch_paddle.tar.gz -C torch_paddle

2、实现

①、激活环境:

conda activate model_service

②、安装打包工具:

# 下载依赖
# pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/
conda install -c conda-forge conda-pack

③、打包

# conda pack -n envsname -o conda_envsname.tar.gz
conda pack -n model_service  -o  conda_model.tar.gz

④、迁入机器部分——解压、部署环境

在你的 anaconda 目录下创建文件夹 名称(envs)即为你迁过来的环境名称

mkdir -p /root/anaconda3/envs/envsname

解压环境(-C 之前为打包压缩文件路径 -C 之后为迁入机器 anaconda3 文件夹下 envs 目录 + 环境名)

tar -xzf /root/tempfile/conda_envsname.tar.gz -C /root/anaconda3/envs/envsname

执行后完成 cd 进 envs 目录中已经可以看到环境拷贝完成

/root/anaconda3/envs/envsname

检查环境是否完全复制

conda activate envsname

pip list
conda list

相关文章:
Window10 pyhive连接hive报错:Could not start SASL: b‘Error in sasl_client_start (-4) SASL(-4)
Conda 环境离线迁移(服务器断网情况下搭建虚拟环境envs)
使用Conda Pack打包Python独立运行时环境

为者常成,行者常至