Python项目中如何导入Git子模块内的模块?
可行的解决方法
方法1:修正sys.path的添加路径
你之前把submodule根目录加到sys.path,但Python需要定位到src目录才能识别src.lib的包结构。正确的做法是将submodule-repo-test/src路径添加到sys.path,这样就能直接从lib导入module:
import os import sys current_dir = os.path.dirname(os.path.abspath(__file__)) # 定位到子模块下的src目录 src_path = os.path.join(current_dir, '..', 'submodule-repo-test', 'src') sys.path.append(src_path) from lib import module
或者直接定位到lib目录,简化导入语句:
lib_path = os.path.join(current_dir, '..', 'submodule-repo-test', 'src', 'lib') sys.path.append(lib_path) import module
方法2:用importlib动态导入(适配含连字符的子模块名)
如果不想调整sys.path层级,可以保留子模块根目录在sys.path中,通过importlib模块绕开连字符的语法限制:
import os import sys import importlib current_dir = os.path.dirname(os.path.abspath(__file__)) submodule_root = os.path.join(current_dir, '..', 'submodule-repo-test') sys.path.append(submodule_root) # 以字符串形式指定模块路径,动态导入 module = importlib.import_module('src.lib.module')
这种方式无需处理子模块名称中的连字符问题,因为importlib接受字符串格式的模块路径。
方法3:给子模块添加__init__.py(可选,需修改子模块)
如果你有权限修改子模块仓库,可以在submodule-repo-test、src、lib三个目录下分别添加空的__init__.py文件,让它们成为Python可识别的包结构。之后将子模块根目录加到sys.path,就能直接按包路径导入:
sys.path.append(submodule_root) from src.lib import module
注意:这个方法需要改动子模块仓库的结构,若不想修改子模块,优先选择前两种方法。
方法4:通过PYTHONPATH环境变量导入(无需修改代码)
在运行main.py之前,将submodule-repo-test/src的绝对路径添加到PYTHONPATH环境变量中:
Linux/macOS终端:
export PYTHONPATH="/path/to/proj/submodule-repo-test/src:$PYTHONPATH" python proj/test/main.py
Windows命令行:
set PYTHONPATH=C:\path\to\proj\submodule-repo-test\src;%PYTHONPATH% python proj\test\main.py
设置完成后,Python会自动识别src下的包结构,你可以直接在main.py中写from lib import module。
内容的提问来源于stack exchange,提问作者Kevin Niland
相关产品推荐
相关产品推荐

