使用Poetry的Python项目获取包版本遇PackageNotFoundError求助
问题原因及解决方案
问题出在importlib.metadata.version()的工作机制——它只会从已安装到Python环境中的包的元数据里读取版本号。你的项目目前仅存在本地目录,未以可编辑模式或正常模式安装到Poetry创建的虚拟环境中,因此importlib.metadata无法找到对应包的元数据,从而抛出PackageNotFoundError。
解决方案1:以开发模式安装项目
在项目根目录执行以下命令,将项目以可编辑模式安装到Poetry虚拟环境:
poetry install
或等价命令:
poetry add --editable .
安装完成后,importlib.metadata.version("gitdida")即可正确读取pyproject.toml中的版本号,测试可正常通过。
解决方案2:硬编码版本并同步(更稳定)
直接在src/gitdida/__init__.py中定义版本号:
__version__ = "0.2.0"
修改测试代码,直接导入该版本号进行断言:
from gitdida import __version__ def test_version(): expected = "0.2.0" assert __version__ == expected
这种方式不依赖包的安装状态,稳定性更强。若担心手动同步pyproject.toml与__init__.py的版本号麻烦,可使用poetry-dynamic-versioning插件实现自动同步(需额外安装配置)。
解决方案3:通过Poetry命令获取版本(临时场景)
若仅需在测试或脚本中临时获取版本,可执行Poetry命令读取:
import subprocess def get_poetry_version(): result = subprocess.run(["poetry", "version", "--short"], capture_output=True, text=True) return result.stdout.strip() def test_version(): expected = "0.2.0" assert get_poetry_version() == expected
该方式依赖系统中Poetry的可用性,不如前两种方案可靠。
内容的提问来源于stack exchange,提问作者Aldwen
相关产品推荐
相关产品推荐

