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

