我正在尝试通过 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)
提前谢谢您!
我也试图保持
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 颜色代码格式化输出。)
这可能不是所有项目都可以接受的,也不是一个合理的答案,但对于我的项目,我通过在第一次应用程序启动期间安装 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+'.*'])