Django中subprocess启动脚本导入自定义src模块失败求助
解决subprocess启动脚本时找不到src模块的问题
这个问题的核心原因很明确:你通过subprocess启动的是一个全新的Python进程,它的sys.path和Django运行的主进程完全独立。虽然Django主进程因为启动时的配置(manage.py会自动把项目根目录加入sys.path)能正常找到src模块,但新启动的Python进程并没有这个配置,所以会报模块找不到的错误。
下面给你几个可行的解决方案,按推荐程度排序:
方案一:指定subprocess的工作目录为项目根
Django的settings.py里已经定义了BASE_DIR(项目根目录,也就是manage.py所在的目录),你可以直接用它来设置subprocess的工作目录,这样新进程的工作目录就是项目根,src作为顶层模块就能被正常识别:
from django.conf import settings import subprocess sb_info = subprocess.run( ['python', 'src/pipeline/master.py', '/tmp'], stdout=subprocess.PIPE, universal_newlines=True, cwd=settings.BASE_DIR # 关键:指定工作目录为项目根 )
方案二:给subprocess设置PYTHONPATH环境变量
如果你不想改变工作目录,可以把项目根目录添加到新进程的PYTHONPATH环境变量中,告诉Python去哪里找src模块:
import os from django.conf import settings import subprocess # 复制当前环境变量,避免破坏原有配置 env = os.environ.copy() # 将项目根目录加入PYTHONPATH env['PYTHONPATH'] = settings.BASE_DIR sb_info = subprocess.run( ['python', 'src/pipeline/master.py', '/tmp'], stdout=subprocess.PIPE, universal_newlines=True, env=env )
方案三:在master.py中手动添加项目根到sys.path
如果上面的方案都不适用,你可以在master.py的最开头添加代码,动态计算项目根目录并加入sys.path:
# master.py 最顶部的代码 import sys import os # 计算项目根目录:master.py在src/pipeline/,所以往上两级就是项目根 project_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) if project_root not in sys.path: sys.path.append(project_root) # 现在再导入你的模块 from src.classes.misc import path_to_dest
补充说明
你提到在views.py里能正常检测到src模块,这是因为Django启动时,manage.py会自动把项目根目录添加到sys.path中,所以主进程能识别src作为顶层包。但subprocess启动的新进程不会继承这个配置,除非你手动设置,这就是为什么只有脚本启动时会报错的原因。
内容的提问来源于stack exchange,提问作者Kailegh
相关产品推荐
相关产品推荐

