代码之家  ›  专栏  ›  技术社区  ›  MLu

防止pip安装某些依赖项

  •  1
  • MLu  · 技术社区  · 8 年前

    我们正在开发 AWS Lambda公司 Python中的Alexa skill函数及其使用 pip 安装 ask-sdk 打包到我们的 dist/ 目录:

    pip install -t dist/ ask-sdk
    

    问题在于 -t dist/ 因为 皮普 希望所有依赖项都在那里,即使它们是在系统范围内安装的。

    现在, 询问sdk 依赖于 boto3 这会带来很多其他的包裹然而 AWS Lambda公司 运行时环境提供 博托3 不需要将它及其依赖项打包到我们的代码中我确实有 博托3 安装在系统中 import boto3 很有效,所以我想 皮普 应该很快乐,但是因为 -t距离/ 它总是安装它。

    我能不能安装 询问sdk 以及系统中不存在的依赖关系,例如 ask-sdk-core ,但不是那些已经安装的?

    一种方法是列出所有模块并使用 pip --no-deps 但这意味着要不断地手动跟踪依赖关系,我们希望避免这种情况。

    不知怎的我想告诉你 皮普 :如果包已经安装,即使不在 -t距离/ 不要放副本进去 距离/ .

    有可能吗?

    谢谢!

    3 回复  |  直到 8 年前
        1
  •  2
  •   raychi    7 年前

    尽管您不能告诉pip“安装除boto3所需的依赖项之外的所有依赖项”,但是您可以生成所需的 requirements.txt 通过计算 boto3 和 ask-sdk 从 pip freeze 输出(使用Python3.6.6测试):

    # get boto3 requirements
    pip install boto3 -t py_lib.boto3
    PYTHONPATH=py_lib.boto3 pip freeze > requirements-boto3.txt
    
    # get ask-sdk requirements
    pip install ask-sdk -t py_lib.ask-sdk
    PYTHONPATH=py_lib.ask-sdk pip freeze > requirements-ask-sdk.txt
    
    # compute their difference
    grep -v -x -f requirements-boto3.txt requirements-ask-sdk.txt > requirements-final.txt
    
    # patch to add one missing dep from boto3
    # aws don't have this for some reason
    grep urllib3 requirements-boto3.txt >> requirements-final.txt
    

    这个 requirements-final.txt 包含以下内容:

    ask-sdk==1.5.0
    ask-sdk-core==1.5.0
    ask-sdk-dynamodb-persistence-adapter==1.5.0
    ask-sdk-model==1.6.2
    ask-sdk-runtime==1.5.0
    certifi==2018.11.29
    chardet==3.0.4
    idna==2.8
    requests==2.21.0
    urllib3==1.24.1
    

    要将最后一组依赖项安装到文件夹,请执行以下操作:

    pip install --no-deps -r requirements-final.txt -t py_lib
    

    跳过 博托3 依赖项,您可以从python依赖项中保存大约45M的数据这个 询问sdk 依赖项只有大约7.5米(压缩了2.1米),如果需要,可以使用内置lambda代码编辑器。

        2
  •  0
  •   Jim Todd    8 年前

    你可以试试

      --no-dependencies
    

    忽略所有依赖项。

    要排除特定的,可以将其放入需求文件并传递:

    pip install --no-deps -r requirements.txt
    
        3
  •  0
  •   Harshit Malhotra    8 年前

    这样就行了

    $ pip install -t dist --no-deps ask-sdk

    在上面的命令之后,我用tree签出了dist目录内容,它只安装了ask sdk,没有依赖项

    dist/
    ├── ask_sdk
    │   ├── __init__.py
    │   ├── __init__.pyc
    │   ├── __version__.py
    │   ├── __version__.pyc
    │   ├── standard.py
    │   └── standard.pyc
    └── ask_sdk-0.1.3.dist-info
        ├── INSTALLER
        ├── METADATA
        ├── RECORD
        ├── WHEEL
        └── top_level.txt