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

Python 3.6 32位Windows系统subprocess.call调用mkdir报错求助

问题原因与修复方案

这问题我之前在Windows上用Python调用系统命令时也踩过坑,本质是Windows和Unix系统的命令差异,以及subprocess的调用逻辑导致的,给你拆解清楚:

为什么会报错?

  1. Windows的mkdir不是独立可执行文件:Linux里的mkdir是/bin目录下的独立程序,但Windows的mkdir是cmd.exe的内部命令——你直接用subprocess.call(["mkdir", ...])时,系统会去查找名为mkdir.exe的可执行文件,自然找不到,所以报FileNotFoundError。
  2. 参数不兼容:就算能调用到Windows的mkdir,它也不支持Unix风格的-p参数(用来递归创建多级目录),后续还是会报错。

修复方案(按推荐程度排序)

方案一:用Python内置的os.makedirs()(最推荐)

完全不需要依赖系统命令,Python原生方法跨平台,还能完美实现递归创建目录的需求:

import os
# 用os.path.join拼接路径更安全,避免路径分隔符问题
target_dir = os.path.join(path_results, f"it{actual_iteration}")
os.makedirs(target_dir, exist_ok=True)
  • exist_ok=True:对应Linuxmkdir -p的效果,目录已存在时不会报错,Python 3.2+就支持,你的3.6版本完全没问题。
  • 优势:跨平台(Windows/Linux/macOS都能跑)、安全(无命令注入风险)、代码简洁。

方案二:通过Shell调用CMD的mkdir命令

如果一定要用subprocess,需要让它通过Shell来调用CMD的内部命令,同时换成Windows支持的参数:

import subprocess
target_dir = path_results + "it" + str(actual_iteration)
# /S 参数用来递归创建多级目录,等价于Unix的-p
subprocess.call(f"mkdir /S {target_dir}", shell=True)
  • 注意:shell=True存在命令注入风险,如果target_dir包含用户输入的不可控内容,不要用这个方案。
  • 也可以用md /S代替mkdir /S,两者在CMD里是等价的。

方案三:调用PowerShell的New-Item命令

PowerShell支持更接近Unix的语法,且不需要开启shell=True,安全性比方案二好:

import subprocess
target_dir = path_results + "it" + str(actual_iteration)
subprocess.call([
    "powershell", "-Command", 
    f"New-Item -ItemType Directory -Path '{target_dir}' -Force"
])
  • -Force参数对应-p的效果,目录存在时不报错;
  • 优势:不需要shell=True,依赖PowerShell(Windows 7及以上默认预装),也能跨平台(现在PowerShell也支持Linux/macOS)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:24:33