无需手动添加路径解决同文件夹下的ModuleNotFoundError问题
问题
运行同文件夹下的test_audio2coeff.py脚本时,遇到ModuleNotFoundError,无法导入同目录的audio2pose_models模块。
目录结构
. ├── audio2exp_models │ ├── audio2exp.py │ ├── networks.py │ └── __pycache__ │ ├── audio2exp.cpython-38.pyc │ └── networks.cpython-38.pyc ├── audio2pose_models │ ├── audio2pose.py │ ├── audio_encoder.py │ ├── cvae.py │ ├── discriminator.py │ ├── networks.py │ ├── __pycache__ │ │ ├── audio2pose.cpython-38.pyc │ │ ├── audio_encoder.cpython-38.pyc │ │ ├── cvae.cpython-38.pyc │ │ ├── discriminator.cpython-38.pyc │ │ ├── networks.cpython-38.pyc │ │ └── res_unet.cpython-38.pyc │ └── res_unet.py ├── test_audio2coeff.py └── utils ├── audio.py ├── croper.py ├── face_enhancer.py ├── hparams.py ├── init_path.py ├── model2safetensor.py ├── paste_pic.py ├── preprocess.py ├── safetensor_helper.py ├── text2speech.py └── videoio.py
test_audio2coeff.py开头代码
import os import torch import random import numpy as np from scipy.io import savemat from yacs.config import CfgNode as CN from scipy.signal import savgol_filter import sys print('__file__: ', __file__) print('sys_path : ', sys.path) from audio2pose_models.audio2pose import Audio2Pose from audio2exp_models.networks import SimpleWrapperV2 from audio2exp_models.audio2exp import Audio2Exp
运行错误信息
__file__: /home/justin/workspace/StyleHEAT/third_part/SadTalker/src/test_audio2coeff.py sys_path : ['/home/justin/workspace/StyleHEAT', '/home/justin/.conda/envs/StyleHEAT/lib/python37.zip', '/home/justin/.conda/envs/StyleHEAT/lib/python3.7', '/home/justin/.conda/envs/StyleHEAT/lib/python3.7/lib-dynload', '/home/justin/.conda/envs/StyleHEAT/lib/python3.7/site-packages', '/home/justin/workspace/StyleHEAT/third_part/SadTalker'] 0%| | 0/1 [00:00<?, ?it/s] Traceback (most recent call last): File "inference.py", line 352, in <module> main() File "inference.py", line 339, in main audio_reenactment(generator, data, args.audio_path) File "inference.py", line 86, in audio_reenactment from third_part.SadTalker.src.test_audio2coeff import Audio2Coeff File "/home/justin/workspace/StyleHEAT/third_part/SadTalker/src/test_audio2coeff.py", line 12, in <module> from audio2pose_models.audio2pose import Audio2Pose ModuleNotFoundError: No module named 'audio2pose_models'
已知可通过添加路径到sys.path解决,但希望找到无需手动追加路径的方案,询问问题原因及解决办法。
原因分析
- Python模块查找机制:Python仅在
sys.path列表中的目录内查找模块。从输出的sys_path可以看到,test_audio2coeff.py所在的/home/justin/workspace/StyleHEAT/third_part/SadTalker/src目录不在sys.path中,导致Python无法定位同目录下的audio2pose_models和audio2exp_models模块。 - 执行上下文问题:脚本是被
inference.py通过from third_part.SadTalker.src.test_audio2coeff import Audio2Coeff导入执行的,此时Python的工作目录是/home/justin/workspace/StyleHEAT,而非test_audio2coeff.py所在的src目录,因此不会自动将src目录加入sys.path。
解决方案
以下方法均无需手动临时追加路径,可长期解决问题:
方法1:用相对导入+标记包目录
- 在
audio2pose_models、audio2exp_models、utils以及src目录下,各创建一个空的__init__.py文件,将这些目录标记为Python可识别的包。 - 修改
test_audio2coeff.py中的导入语句为相对导入:
# test_audio2coeff.py中修改导入部分 from .audio2pose_models.audio2pose import Audio2Pose from .audio2exp_models.networks import SimpleWrapperV2 from .audio2exp_models.audio2exp import Audio2Exp
当前inference.py中导入test_audio2coeff的方式已经符合包导入要求,无需额外修改。
方法2:将src目录加入Python环境变量
- 临时生效:在终端执行以下命令
export PYTHONPATH="/home/justin/workspace/StyleHEAT/third_part/SadTalker/src:$PYTHONPATH"
- 永久生效:将上述命令添加到你的shell配置文件(如
~/.bashrc、~/.zshrc),执行source ~/.bashrc(对应你的配置文件)使修改生效。
方法3:安装为可编辑项目包
- 在
/home/justin/workspace/StyleHEAT/third_part/SadTalker目录下创建setup.py文件,内容如下:
from setuptools import setup, find_packages setup( name='SadTalker', version='0.1', packages=find_packages(where='src'), package_dir={'': 'src'}, )
- 在终端进入该目录,执行:
pip install -e .
此操作会将项目以可编辑模式安装到Python环境,Python会自动识别src目录下的所有包,无需手动配置路径。
内容的提问来源于stack exchange,提问作者Ahn Jun-Yeong
相关产品推荐
相关产品推荐

