通过 Poetry 中的 bash 命令输出确定要安装的软件包版本

问题描述 投票:0回答:2

我正在尝试通过 Poetry 安装一个 Python 包,其安装版本应根据 Bash 命令的输出(〜返回值)确定。

是否可以按照以下方式做一些事情(在

pyproject.toml
中):

[tool.poetry.dependencies]
python = "^3.8"
this-package = "^$(path-to-executable --version)"

其中

$(path-to-executable --version)
是会输出版本的 bash 命令调用?

理想情况下,无需在 Poetry 之上运行脚本/Makefile/"""something"""(正如 这个 Git 线程 似乎指出的那样)

具体来说,这是因为我正在尝试安装 GDAL。我们不使用太高级的功能,所以几乎任何版本都可以。但是,要安装的 Python 包在很大程度上取决于系统中安装的 Gdal 可执行文件(及其库)的版本。可以在终端中运行

gdal-config --version
来确定。就我而言(Ubuntu 18.02),该命令返回
2.2.3
,但 Ubuntu 永远不会返回更高的值。

所以,我正在尝试使 Poetry 的

pyproject.toml
中的依赖项解析变得有点动态:无论谁尝试安装我的包,仍然需要安装
libgdal-dev
和其他依赖项,但我希望它成为一个tiiiiiny 位动态,因此他们不必编辑
pyproject.toml
文件来填充 他们的 版本的 Gdal。另外,这是供内部使用的,因此它只需要在类似 Linux 的系统中工作(不需要 Windows 或 Apple)

提前谢谢您!

python installation dependencies gdal python-poetry
2个回答
1
投票

我也试图保持

pyproject.toml
GDAL 版本与安装同步,但我正在以相反的方式进行:使用 Poetry 的版本来安装系统库。

不幸的是,Poetry 还没有办法只获取包版本,但经过一番欺骗后,我最终得到了this

sudo apt-get --assume-yes install libgdal-dev="$(poetry show gdal | tr --delete ' ' | grep '^version:' | cut --delimiter=':' --fields=2)*"
。它获取将要安装的版本;它不需要已经安装。 (幸运的是,Poetry 在传递到管道时不会使用 ANSI 颜色代码格式化输出。)


0
投票

这可能不是所有项目都可以接受的,也不是一个合理的答案,但对于我的项目,我通过在第一次应用程序启动期间安装 gdal 来解决这个问题。 在应用程序入口点脚本中,或在包中

__init__.py
:

#Install gdal:
import sys,subprocess
try:
    gdal_version = subprocess.check_output(["gdal-config","--version"]).decode().split('\n')[0]
except FileNotFoundError as E:
    print(E.args)
    print("gdal-config command cound not be found on this system. You must install it before launching PlatRock by invoking (adapt to your OS) 'sudo apt install gdal-bin'")
    sys.exit(1)
try:
    import osgeo
    print("osgeo=="+osgeo.__version__+" python package was found.")
except ImportError as E:
    print(E.args)
    print('osgeo=='+gdal_version+' python package was not yet installed, try to install it now...')
    subprocess.check_call([sys.executable, "-m", "pip", "install", 'gdal[numpy]=='+gdal_version+'.*'])
© www.soinside.com 2019 - 2024. All rights reserved.