Bash 脚本从 setup.py 或 PKG-INFO 文件中获取版本并导出为环境变量

Posted

技术标签:

【中文标题】Bash 脚本从 setup.py 或 PKG-INFO 文件中获取版本并导出为环境变量【英文标题】:Bash script get version from setup.py or from PKG-INFO file and export as environment variable 【发布时间】:2021-10-20 07:06:00 【问题描述】:

我需要使用 bash 从 setup.py 或 PKG-INFO 获取版本值,并使用版本值提取环境变量以供以后使用。 (其实我需要 GitHub Action 的版本值)

from setuptools import setup, find_packages

with open("README.md", "r") as fh:
    long_description = fh.read()

setup(
    name="helloworld",
    version="0.0.3",
    author="John",
    author_email="john@gmail.com",
    url="https://github.com/google/helloworld",
    description="Hello World!",
    long_description=long_description,
    long_description_content_type="text/markdown",
    packages=find_packages(),
    classifiers=[
        "Programming Language :: Python :: 3",
        "License :: OSI Approved :: MIT License",
        "Operating System :: OS Independent",
    ],
    install_requires=["click"],
    python_requires='>=3.6',
    py_modules=["helloworld"],
    entry_points="console_scripts": ["helloworld = src.main:main"],
)

PKG-信息:

Metadata-Version: 2.1
Name: helloworld
Version: 0.0.3
Summary: Hello World!
Home-page: https://github.com/google/helloworld
Author: John
Author-email: john@gmail.com
License: UNKNOWN
Platform: UNKNOWN
Classifier: Programming Language :: Python :: 3
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Requires-Python: >=3.6
Description-Content-Type: text/markdown

# helloworld

Hello World Python
...

【问题讨论】:

你试过什么?这可能是重复的。 你为什么不使用 github 脚本而不是 bash,因为你提到你的包是独立于操作系统的,你需要一个 POSIX 解决方案。这里还描述了python解决方案***.com/questions/2058802/…,您可以在上一步中使用它并在工作序列的下一步中获得答案。 【参考方案1】:

我需要使用 bash 从 setup.py 或 PKG-INFO 获取版本值,并使用版本值提取环境变量以供以后使用。

PKG-INFO 获取所需数据可能比从setup.py 更容易。假设只有一个Version: 条目,您可以使用sed

the_version=$(sed -n 's/^Version: *//p' PKG-INFO) ||
  echo 'no version found' 1>&2
export the_version

解释:

sed-n 选项禁止在每个循环结束时打印当前行的默认行为。 s 命令从任何以它开头的行中删除Version: 标签。 p 后缀会导致(仅)为实际执行替换的行打印替换结果。 sed 命令周围的$() 构造捕获并扩展为该命令的标准输出,这将是Version: 行的尾部。然后将其分配给 shell 变量 the_version。 如果sed 以非零退出状态终止,则执行echo 命令以打印诊断信息,该诊断信息被重定向到标准错误而不是标准输出 shell 变量为exported,以便脚本运行的后续命令将在其环境中接收它。 如果命令以非零退出状态退出,则会将诊断信息打印到标准错误流中

【讨论】:

【参考方案2】:

虽然比我容易:

VERSION=$(python setup.py --version)
echo $VERSION

同样的方法也可以得到模块名:

MODULE_NAME=$(python setup.py --name)
echo $MODULE_NAME

【讨论】:

以上是关于Bash 脚本从 setup.py 或 PKG-INFO 文件中获取版本并导出为环境变量的主要内容,如果未能解决你的问题,请参考以下文章

distutils:如何将用户定义的参数传递给 setup.py?

我的setup.py在python 3.8.1中安装所有依赖项有什么问题

如何在 setup.py 脚本中设置错误跟踪器 url

在 setup.py 脚本中安装 nltk 数据依赖项

setup.py 中 entry_points/console_scripts 和脚本之间的区别?

我应该如何处理在我的 setup.py 脚本中导入第三方库?