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

如何在Snowflake Python工作表中导入非Anaconda的Python库?

Snowflake Python工作表解密ADLS PGP文件:自定义库导入全流程+问题解答

一、Stage上传.whl包并导入Python工作表的完整步骤

1. 先搞定兼容的whl包

Snowflake的Python运行环境是manylinux_x86_64架构,你上传的whl必须是这个版本——Windows/macOS版的包直接会失效。如果之前下错了,用这条命令在本地虚拟环境里下载兼容包及所有依赖项:

pip download --platform manylinux_x86_64 --only-binary=:all: pgpy azure-keyvault-secrets azure-identity

2. 把whl上传到Snowflake Stage

用SQL执行上传,必须加AUTO_COMPRESS=FALSE,不然Snowflake会自动压缩whl,导致后续无法识别:

-- 替换成你的本地路径和stage名称
PUT file:///本地文件夹路径/pgpy-*.whl @your_custom_stage AUTO_COMPRESS=FALSE;
PUT file:///本地文件夹路径/azure_keyvault_secrets-*.whl @your_custom_stage AUTO_COMPRESS=FALSE;
PUT file:///本地文件夹路径/azure_identity-*.whl @your_custom_stage AUTO_COMPRESS=FALSE;
-- 别忘了把所有依赖的whl也上传,比如msal、cryptography这些
PUT file:///本地文件夹路径/msal-*.whl @your_custom_stage AUTO_COMPRESS=FALSE;
PUT file:///本地文件夹路径/cryptography-*.whl @your_custom_stage AUTO_COMPRESS=FALSE;

3. 在Python工作表中加载并导入包

在工作表的主函数里,先把stage路径加到Python的模块搜索路径,再导入库:

import sys
import snowflake.snowpark as snowpark

def main(session: snowpark.Session):
    # 获取stage的绝对路径并添加到sys.path
    stage_full_path = session.get_stage_location("@your_custom_stage")
    sys.path.append(stage_full_path)
    
    # 现在可以正常导入库了
    import pgpy
    from azure.keyvault.secrets import SecretClient
    from azure.identity import DefaultAzureCredential
    
    # 从Azure Key Vault获取PGP私钥
    credential = DefaultAzureCredential()
    secret_client = SecretClient(vault_url="https://你的密钥库名称.vault.azure.net/", credential=credential)
    pgp_private_key = secret_client.get_secret("你的PGP私钥密钥名称").value
    
    # 读取ADLS中的PGP文件(前提是ADLS已挂载为Snowflake外部stage)
    with session.file.get("@adls_external_stage/目标文件.pgp", "/tmp/") as f:
        pgp_file_content = f.read()
    
    # PGP解密逻辑
    key, _ = pgpy.PGPKey.from_blob(pgp_private_key)
    with key.unlock("你的私钥密码"):
        msg = pgpy.PGPMessage.from_blob(pgp_file_content)
        decrypted_data = key.decrypt(msg).message
    
    return decrypted_data

4. 导入失败的常见排查点

  • 检查stage里的whl有没有被压缩:如果文件名带.gz,说明上传时没加AUTO_COMPRESS=FALSE,重新上传;
  • 看工作表的运行日志:如果提示找不到某个依赖,就把对应的whl也上传到stage;
  • 确认包版本匹配:比如azure-identity和azure-keyvault-secrets的版本要兼容,避免版本冲突。

二、能不能把azure_identity转成单个.py文件导入?

不行。azure_identity是一个依赖复杂的包,内部包含多个子模块,还依赖msal、cryptography、requests等第三方库,根本没法拆成单个.py文件。强行合并会导致大量依赖缺失,功能完全用不了,老老实实传whl包才是靠谱方案。

(附截图说明:

  • Snowflake Stage文件截图:显示stage中已上传pgpy、azure相关及依赖库的whl文件;
  • Python包列表截图:列出项目所需的pgpy、azure-keyvault-secrets、azure-identity等包及其对应版本)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 03:22:52