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

Python中os.path.exists()为True但subprocess调用dir提示找不到文件

问题排查与解决方法

1. 不带shell=True调用失败的核心原因

dir是Windows CMD的内置命令,并非独立可执行文件(不存在dir.exe)。当subprocess.Popen使用shell=False时,Python会直接在系统路径中查找名为dir的可执行程序,必然找不到。正确的做法是通过调用cmd.exe来执行dir命令:

import subprocess
path = r'C:\Users\Foo\Documents\bar\doc.txt'
# 不带shell=True的正确调用方式
proc = subprocess.Popen(['cmd.exe', '/c', f'dir "{path}"'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = proc.communicate()
print(stdout.decode('gbk'))  # Windows CMD默认编码为gbk,需对应解码

2. 带shell=True调用失败的常见原因

若带shell=True仍报错,大概率是路径传递的格式问题:

  • 字符串转义问题:确保路径使用Python原始字符串(前缀r),避免反斜杠被解析为转义字符。例如使用r'C:\Users\Foo\Documents\bar\doc.txt',而非普通字符串'C:\Users\Foo\Documents\bar\doc.txt'——后者中的\U会被视为Unicode转义符,导致实际传递给CMD的路径变形。
  • 路径未加引号:即使路径无空格,用双引号包裹路径能避免CMD解析时的意外(比如路径含特殊字符)。正确示例:
import subprocess
path = r'C:\Users\Foo\Documents\bar\doc.txt'
proc = subprocess.Popen(f'dir "{path}"', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = proc.communicate()
print(stdout.decode('gbk'))

3. 额外排查方向

  • 手动验证CMD访问权限:在虚拟机的CMD中直接执行dir C:\Users\Foo\Documents\bar\doc.txt,确认CMD本身能访问该文件(排除虚拟机共享文件夹权限继承问题)。
  • 检查进程权限:极少数情况下,Python进程和CMD进程的权限可能存在差异,可尝试以管理员身份运行Python脚本后重试。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 23:54:54