Python 3.6 32位Windows系统subprocess.call调用mkdir报错求助
问题原因与修复方案
这问题我之前在Windows上用Python调用系统命令时也踩过坑,本质是Windows和Unix系统的命令差异,以及subprocess的调用逻辑导致的,给你拆解清楚:
为什么会报错?
- Windows的
mkdir不是独立可执行文件:Linux里的mkdir是/bin目录下的独立程序,但Windows的mkdir是cmd.exe的内部命令——你直接用subprocess.call(["mkdir", ...])时,系统会去查找名为mkdir.exe的可执行文件,自然找不到,所以报FileNotFoundError。 - 参数不兼容:就算能调用到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
相关产品推荐
相关产品推荐

