You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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),但mylibsrc/目录下,不在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

火山引擎 最新活动