仅导入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
相关产品推荐
相关产品推荐

