You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:27:18