如何在未安装的Python模块中读取版本字符串
未安装模块时获取同目录__init__.py中的版本号
针对你遇到的未安装模块、无法从同目录__init__.py获取版本号的问题,这里提供两种可行方案:
方案一:相对导入
在src/acme.py中直接使用相对导入语句:
# src/acme.py from . import version print(version) # 输出0.0.7
注意:如果直接运行python src/acme.py会触发相对导入错误,此时需要以模块方式运行脚本,在项目根目录(src的上级目录)执行:
python -m src.acme
方案二:直接读取文件解析
如果不想受运行方式限制,可直接读取__init__.py文件内容,用正则提取版本号:
# src/acme.py import re def get_project_version(): # 打开同目录下的__init__.py with open(__file__.replace('acme.py', '__init__.py'), 'r', encoding='utf-8') as f: file_content = f.read() # 匹配version = 'x.x.x'格式的字符串 version_match = re.search(r"version\s*=\s*'([^']+)'", file_content) if version_match: return version_match.group(1) raise RuntimeError("未在__init__.py中找到版本号定义") # 获取版本号并使用 current_version = get_project_version() print(current_version)
这种方法不依赖Python的导入机制,无论以哪种方式运行acme.py都能正常获取版本号,适合未安装模块的场景。
为什么常规导入方法失败
常规的from src import version或import src要求src所在目录在Python的sys.path中,且模块已被识别。但未安装模块时,若直接运行src/acme.py,Python会将src目录加入sys.path,此时src本身不再是可导入的模块,导致导入失败;若从项目根目录运行,sys.path默认包含根目录,这时候import src是可行的,但很多场景下开发者习惯直接运行脚本,就会出现问题。
内容的提问来源于stack exchange,提问作者Olumide
相关产品推荐
相关产品推荐

