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

仅导入subprocess的run函数时,如何在Python中对其进行patch?

解决subprocess.run的patch问题(无需导入整个模块)

问题原因

当你使用from subprocess import run时,当前代码里的run是直接指向该函数的局部引用,而patch.object(subprocess, 'run')修改的是subprocess模块级别的run属性,不会影响已经导入到当前命名空间的run变量,所以patch不生效。

两种可行解决方案

方案一:patch当前模块中的run引用

不需要导入整个subprocess模块,直接patch当前代码所在模块里的run对象:

from subprocess import run
from unittest.mock import patch

def test_example():
    # 用__name__指代当前模块,patch局部的run引用
    with patch(f"{__name__}.run", return_value=None):
        run(["some_command"])  # 此处的run会被成功patch

方案二:导入subprocess模块对象(而非单独的run函数)

这种方式并没有导入模块的所有内容,只是引入模块本身,既满足"减少不必要导入"的需求,又能让patch正常生效:

import subprocess
from unittest.mock import patch

def test_example():
    with patch("subprocess.run", return_value=None):
        subprocess.run(["some_command"])  # patch正常生效

总结

  • 若坚持使用from subprocess import run的导入方式,选择方案一,patch当前模块的局部run引用;
  • 若可以接受导入subprocess模块对象,方案二更直观,且同样不会引入多余内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 11:25:27