使用subprocess.Popen调用Python脚本无响应或报ModuleNotFoundError如何解决
问题排查与解决步骤
1. 解决ModuleNotFoundError报错
该报错的核心原因是你确认安装了requests的Python解释器,和subprocess调用的指定Python解释器不是同一个:
- 执行以下命令校验指定解释器是否安装了requests:
/Library/Frameworks/Python.framework/Versions/3.8/bin/python3 -m pip show requests - 如果返回
WARNING: Package(s) not found: requests,说明你之前安装requests时使用了其他Python版本(比如系统默认Python、conda虚拟环境Python、其他版本的Python3),需要用你调用的解释器重新安装:/Library/Frameworks/Python.framework/Versions/3.8/bin/python3 -m pip install requests
2. 解决myscript.py未实际执行的问题
你当前的写法没有捕获子进程的输出,也没有等待子进程运行结束,无法判断执行状态:
p.poll() is None仅表示子进程还在运行中没有退出,不代表脚本没执行。如果脚本本身是后台运行、有阻塞逻辑、或者执行速度极快,你可能感知不到运行行为。- 修改代码,捕获子进程的输出和错误信息,明确执行状态:
import subprocess # 传入stdout、stderr参数捕获输出,text=True指定输出为字符串而非二进制 p = subprocess.Popen( ['/Library/Frameworks/Python.framework/Versions/3.8/bin/python3', 'myscript.py'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True ) # 等待子进程执行结束,获取输出内容 stdout, stderr = p.communicate() print("子进程标准输出:", stdout) print("子进程错误输出:", stderr) print("子进程退出码:", p.returncode)
执行后根据打印的输出即可判断脚本是否正常运行、有没有触发其他报错。
优化建议
- 不要硬编码Python解释器路径,使用
sys.executable直接获取当前主脚本运行使用的Python解释器路径,保证依赖环境和主脚本一致,避免环境不一致导致的模块找不到问题:
import subprocess import sys p = subprocess.Popen( [sys.executable, 'myscript.py'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True )
- 确保
myscript.py路径正确:如果主脚本的运行工作目录和myscript.py存放目录不一致,需要填写myscript.py的绝对路径,避免找不到文件的隐式错误。
内容的提问来源于stack exchange,提问作者JoeBadAss
相关产品推荐
相关产品推荐

