Python导入ProofOfConcept_1类遇ModuleNotFoundError,求正确导入方法
解决Python模块导入错误:ModuleNotFoundError: No module named 'multiprocessingTests'
问题详情
运行start.py时触发如下错误:
PS M:\projects\python\flask apps\openRoutService\apps\app5\app5-test> & C:/Python310/python.exe "m:/projects/python/flask apps/openRoutService/apps/app5/app5-test/multiprocessingTests/PoolExexOnPoolExecConcept/start.py" Traceback (most recent call last): File "m:\projects\python\flask apps\openRoutService\apps\app5\app5-test\multiprocessingTests\PoolExexOnPoolExecConcept\start.py", line 1, in <module> from multiprocessingTests.PoolExexOnPoolExecConcept.ProofOfConcept_1 import ProofOfConcept_1 ModuleNotFoundError: No module named 'multiprocessingTests'
相关代码
start.py
from multiprocessingTests.PoolExexOnPoolExecConcept.ProofOfConcept_1 import ProofOfConcept_1 if __name__ == '__main__': ProofOfConcept_1.parallel()
ProofOfConcept_1.py
import time import logging import logging.config import configparser from multiprocessingTests.PoolExexOnPoolExecConcept.TreatmentPoolExec import TreatmentPoolExec from multiprocessingTests.PoolExexOnPoolExecConcept.BufferPoolExec import BufferPoolExec from utils.PoolUtils import PoolUtils from Multiprocessing.KeyAndNoneKeyGridCells.pool.GridCellsProfiles.VarTasksDispatcher import VarTasksDispatcher logging.basicConfig(level=logging.DEBUG) logging.config.dictConfig({ 'version': 1, 'disable_existing_loggers': True, }) config = configparser.ConfigParser() config.read('configs.ini') logger = logging.getLogger() logger.setLevel(logging.DEBUG) class ProofOfConcept_1(object): @staticmethod def parallel(): strtTime = time.time() processesCount, procsRem = PoolUtils.getProcessesCountPerPool(numOfPools=2,processesCount=int(config['MULTIPROCESSING']['processes_count'])) cpuCount, cpuRem = PoolUtils.getCpuCountPerPool(numOfPools=2,cpuCount=int(config['MULTIPROCESSING']['cpu_count'])) calcETRRiskInTreatmentForResourcesPoolExec = TreatmentPoolExec(processCount=processesCount+procsRem,cpuCount=cpuCount+cpuRem) calcETRRiskInTreatmentForResourcesPoolExec.setIterables([0]) calcETRRiskInBufferForResourcesPoolExec = BufferPoolExec(processCount=processesCount,cpuCount=cpuCount) calcETRRiskInBufferForResourcesPoolExec.setIterables([0]) calcETRRiskPoolExecList = [] calcETRRiskPoolExecList.append(calcETRRiskInTreatmentForResourcesPoolExec) calcETRRiskPoolExecList.append(calcETRRiskInBufferForResourcesPoolExec) varTasksDispatcher = VarTasksDispatcher() '''no results to be sent back''' res = varTasksDispatcher.dispatch(calcETRRiskPoolExecList)
路径结构
app5-test/ ├── multiprocessingTests/ │ └── PoolExexOnPoolExecConcept/ │ ├── start.py │ ├── ProofOfConcept_1.py │ ├── TreatmentPoolExec.py │ ├── BufferPoolExec.py ├── utils/ │ └── PoolUtils.py ├── Multiprocessing/ │ └── KeyAndNoneKeyGridCells/ │ └── pool/ │ └── GridCellsProfiles/ │ └── VarTasksDispatcher.py └── configs.ini
解决方案
方法1:使用同目录直接导入
start.py和ProofOfConcept_1.py在同一目录,修改导入语句为:
# start.py from ProofOfConcept_1 import ProofOfConcept_1
同时修改ProofOfConcept_1.py里的同目录导入:
# ProofOfConcept_1.py from TreatmentPoolExec import TreatmentPoolExec from BufferPoolExec import BufferPoolExec
方法2:将项目根目录加入Python搜索路径
在start.py开头添加代码,把app5-test目录加入sys.path:
import sys import os # 获取当前文件所在目录 current_dir = os.path.dirname(os.path.abspath(__file__)) # 向上回溯3级,定位到app5-test目录 project_root = os.path.abspath(os.path.join(current_dir, '../../..')) sys.path.append(project_root) # 之后可正常使用原绝对导入语句 from multiprocessingTests.PoolExexOnPoolExecConcept.ProofOfConcept_1 import ProofOfConcept_1
方法3:切换工作目录后运行脚本
打开终端,切换到app5-test目录再执行脚本:
cd "M:\projects\python\flask apps\openRoutService\apps\app5\app5-test" python multiprocessingTests/PoolExexOnPoolExecConcept/start.py
Python会自动将当前工作目录加入模块搜索路径,所有绝对导入可正常生效。
方法4:标记目录为Python包
在所有需要作为模块的目录下创建空的__init__.py文件,包括:
multiprocessingTests/multiprocessingTests/PoolExexOnPoolExecConcept/utils/Multiprocessing/及其所有子目录
之后搭配方法2或方法3运行脚本即可。
内容的提问来源于stack exchange,提问作者Amrmsmb
相关产品推荐
相关产品推荐

