【问题标题】:How to get the location of installed Python package into the shell如何将安装的 Python 包的位置获取到 shell 中
【发布时间】:2021-12-03 15:45:57
【问题描述】:

我希望我的用户能够直接从 shell 引用我的 python 包中的文件(特别是 docker-compose.yml 文件)。

我找不到pip show 获取位置的方法(并且从其输出中 grep-ing 出“位置”感觉很难看),所以我目前(有点冗长)的解决方案是:

docker compose -f $(python3 -c "import locust_plugins; print(locust_plugins.__path__[0])")/timescale/docker-compose.yml up

有没有更好的办法?

编辑:我通过安装一个包装器命令解决了这个问题,我称之为locust-compose 作为包的一部分。不完美,但它可以完成工作:

#!/bin/bash
module_location=$(python3 -c "import locust_plugins; print(locust_plugins.__path__[0])")
set -x
docker compose -f $module_location/timescale/docker-compose.yml "$@"

【问题讨论】:

    标签: python docker-compose


    【解决方案1】:

    您需要的大部分支持都在核心 setuptools 套件中。

    首先,您需要确保data file is included in your package。在setup.cfg 文件中你可以写:

    [options.package_data]
    timescale = docker-compose.yml
    

    现在,如果您 pip install .pip wheel,这将包含 Compose 文件作为 Python 包的一部分。

    接下来,您可以使用ResourceManager API:在 Python 代码中检索它:

    #!/usr/bin/env python3
    # timescale/compose_path.py
    
    import pkg_resources
    
    if __name__ == '__main__':
      print(pkg_resources.resource_filename('timescale', 'docker-compose.yml'))
    

    最后,您可以使用该脚本并将其设置为 setuptools entry point script(与名称相似的 Docker 概念不同),以便您可以将其作为单个命令运行。

    [options.entry_points]
    console_scripts=
      timescale_compose_path = timescale:compose_path
    

    同样,如果你 pip install . 进入虚拟环境,你应该能够运行 timescale_compose_path 并获取路径名。

    完成所有这些步骤后,您终于可以运行一个更简单的了

    docker-compose -f $(timescale_compose_path) up
    

    【讨论】:

    • 不错!我已经完成了第一部分(尽管我使用 MANIFEST.in 将文件包含在我的包中)。我不想强迫我的用户运行 virtualenv,所以很遗憾我认为我不能使用你的方法。
    • 或者等等,也许您的解决方案并不真的需要 virtualenv?如果是这样,它与我的解决方案非常相似,甚至可能更好。无论哪种方式,我们的两个解决方案都是我认为(希望)有一个更简单的解决方案的更多解决方法。
    • 它不应该特别需要虚拟环境,但它确实需要使用普通工具实际安装包。
    猜你喜欢
    • 2015-01-21
    • 1970-01-01
    • 2020-01-25
    • 2015-11-14
    • 2013-06-17
    • 1970-01-01
    • 2011-09-09
    • 2016-08-13
    • 2021-06-08
    相关资源
    最近更新 更多