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

Docker中AmazonLinux2环境下subprocess调用脚本遇ModuleNotFoundError求助

问题:subprocess调用Python文件时出现yaml模块找不到的错误

环境与问题背景

基于Docker中的AmazonLinux2环境,采用Django框架开发。使用subprocess.run()调用外部Python文件时,明明已经通过pip install pyyaml安装了yaml模块,但被调用的文件抛出ModuleNotFoundError: No module named 'yaml'。当前调用脚本本身可以正常import yaml,只有被subprocess启动的子进程报错。

相关代码

调用脚本(无报错)

import yaml
import os
import subprocess

script = os.path.join(os.path.dirname(__file__), "script.py")
subprocess.run(
    [script, args1, args2],
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE,
)

被调用的脚本(报错)

#!/usr/bin/env python3

# os可正常加载
import os 

import yaml

def main():
    # 业务逻辑
    pass

if __name__ == "__main__":
    main()

错误信息

ModuleNotFoundError: No module named 'yaml'

安装命令

pip install pyyaml

原因分析

subprocess启动的子进程会使用系统默认的Python解释器,而非当前Django进程所在的Python环境(比如虚拟环境、或者pip安装模块对应的Python版本)。当前调用脚本能正常import yaml,说明当前环境已安装模块,但子进程使用的Python解释器并未安装该模块。

解决方案

方案1:指定当前环境的Python解释器执行脚本

直接用当前进程的Python路径(sys.executable)来启动脚本,确保子进程和父进程使用同一个Python环境:

import yaml
import os
import subprocess
import sys

script = os.path.join(os.path.dirname(__file__), "script.py")
subprocess.run(
    [sys.executable, script, args1, args2],  # 用sys.executable替代直接执行脚本
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE,
)

方案2:修正被调用脚本的shebang

如果使用虚拟环境,将被调用脚本的shebang改为虚拟环境中Python的绝对路径,比如:

#!/path/to/your/venv/bin/python3

或者确保#!/usr/bin/env python3指向的是安装了pyyaml的Python解释器。

方案3:确保pip与子进程Python版本匹配

如果子进程使用python3,则用对应版本的pip安装模块:

pip3 install pyyaml

避免因pip默认绑定Python2,导致模块安装到了Python2环境中。

内容的提问来源于stack exchange,提问作者jtsoc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 05:46:26