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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 22:10:34