Python未设shell=True时Subprocess无法找到模块问题求助
解决subprocess.Popen不设shell=True时找不到torch模块的问题
问题原因
当shell=False时,subprocess.Popen会直接调用系统默认的python解释器(通常是全局环境的),而你的torch模块只安装在PyCharm的虚拟环境(venv)中,因此子进程找不到该模块。而shell=True时会加载用户的shell环境变量,自动使用虚拟环境的python,所以能正常运行,但会带来communicate调用后的代码执行问题。
可行解决方案
1. 指定虚拟环境中Python解释器的绝对路径
直接调用虚拟环境内的python.exe,确保子进程使用正确的解释器:
import subprocess detectPath = "C:\\Users\\Student01\\PycharmProjects\\yolov5-master\\detect.py" # 替换为你的虚拟环境python.exe实际路径 python_exe = "C:\\Users\\Student01\\PycharmProjects\\your_project\\venv\\Scripts\\python.exe" print("First Print Passed") # shell=False时必须用列表形式传递参数,避免命令拆分错误 process = subprocess.Popen([python_exe, detectPath, "--source", "0"], stdout=subprocess.PIPE, shell=False) while process.poll() is None: line = process.stdout.readline() if line: print(line.decode('utf-8').strip()) print("Poll is None")
2. 传递父进程的环境变量给子进程
父进程运行在虚拟环境中,其环境变量包含了虚拟环境的模块路径,将这些环境变量传递给子进程:
import subprocess import os detectPath = "C:\\Users\\Student01\\PycharmProjects\\yolov5-master\\detect.py" python_exe = "python" # 若父环境已激活venv可直接用,否则建议用绝对路径 env = os.environ.copy() # 复制当前虚拟环境的环境变量 process = subprocess.Popen([python_exe, detectPath, "--source", "0"], stdout=subprocess.PIPE, shell=False, env=env) while process.poll() is None: line = process.stdout.readline() if line: print(line.decode('utf-8').strip()) print("Poll is None")
3. 确认PyCharm运行配置的解释器
- 打开PyCharm的「Run/Debug Configurations」
- 检查「Python interpreter」是否选择了当前项目的虚拟环境(venv),而非全局Python解释器
- 确保运行配置的工作目录与项目目录一致
注意:shell=False时,必须用列表形式传递命令参数,不能用拼接后的字符串,否则会把整个字符串当作单个命令去查找,导致执行失败。
内容的提问来源于stack exchange,提问作者Great God gaming
相关产品推荐
相关产品推荐

