Python项目从__init__.py导入__version__遇ImportError问题求助
解决Python模块导入错误:ImportError: cannot import name 'version'
你遇到的问题核心其实是Python找不到mylib模块的正确路径,而非__version__变量本身有问题——毕竟你改了变量名还是报错,说明脚本根本没成功定位到mylib模块。
先明确下你的项目结构:
src/ ├── scripts/ │ └── script1 └── mylib/ ├── __init__.py └── a_module.py
当你直接运行./script1时,Python会自动把scripts/目录加入模块搜索路径(sys.path),但mylib在src/目录下,不在scripts/的搜索范围内,所以Python根本找不到mylib模块,自然会报错说找不到里面的变量。
下面是几种可行的解决方案:
方案1:在脚本中手动添加模块路径
在script1的最开头添加代码,把src/目录(mylib所在的父目录)加入Python的搜索路径:
import sys import os # 获取当前脚本所在目录的上级目录(即src/) src_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) sys.path.append(src_dir) # 现在再导入就可以正常执行了 from mylib import __version__ as _ver print(_ver)
方案2:通过环境变量临时设置搜索路径
运行脚本前,先设置PYTHONPATH环境变量指向src/目录,再执行脚本:
# 假设你当前在src/目录下 PYTHONPATH=$(pwd) python scripts/script1 # 或者直接指定src目录的绝对路径 PYTHONPATH=/your/absolute/path/to/src python scripts/script1
方案3:将mylib作为可安装包(推荐长期项目使用)
如果这是一个需要长期维护的项目,建议把mylib做成可安装的Python包。在src/目录下创建pyproject.toml文件,内容如下:
[build-system] requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" [project] name = "mylib" version = "0.0.1" packages = ["mylib"]
然后在src/目录下执行:
pip install -e .
(-e表示开发模式,修改代码后无需重新安装)
安装完成后,无论你在哪个目录运行script1,都能直接导入mylib模块了。
内容的提问来源于stack exchange,提问作者arielnmz




