os模块与subprocess模块的区别及Windows下脚本报错问题
嘿,我来帮你理清这两个模块的区别,再解决你Windows下的脚本问题~
os模块与subprocess模块的区别
这俩模块都是Python用来和操作系统交互的,但定位和用法差异很大:
- 核心定位不同:os模块是Python内置的「系统交互基础工具包」,主打文件/目录操作、环境变量管理、进程基础控制等底层系统功能,很多操作是Python封装好的,不需要直接调用系统终端命令;而subprocess模块则专注于「创建和管控子进程」,核心是让你在Python里执行外部系统命令(比如Linux的
ls、Windows的dir),还能处理命令的输入、输出和错误流。 - 使用场景差异:如果只是做创建目录、删除文件、判断路径是否存在这类基础操作,用os模块更直接,不需要启动额外进程,效率更高;如果需要调用系统自带的外部工具(比如ffmpeg转码、git提交),或者需要获取命令执行的输出/错误信息,subprocess是更合适的选择,它能精细控制子进程的运行状态。
- 跨平台适配性:os模块的多数函数是高层封装,会自动适配不同系统(比如
os.mkdir在Windows和Linux下逻辑一致);而subprocess是直接执行你传入的命令,需要自己处理跨系统的命令差异(比如Linux用cp复制文件,Windows用copy)。
你的Windows脚本报错原因及解决方法
你遇到的Error 2是因为Windows CMD里的mkdir是内置命令,不是独立的可执行文件(不像Linux里的mkdir是/bin/mkdir),subprocess默认会去查找可执行文件,找不到就会报错。这里给你两种解决思路:
方法1:通过cmd.exe调用内置命令
Windows的内置命令需要通过cmd /c来触发,修改后的代码如下:
import sys import subprocess script = sys.argv name = str(script[0]) print(name) # 注意Python3里print需要加括号,你原代码是Python2写法,Windows大概率装的是Python3 for i in range(0,10): fold = 'Lombriz'+str(i) subprocess.call(['cmd', '/c', 'mkdir', fold]) subprocess.call(['cmd', '/c', 'copy', name, fold]) # Windows复制文件用copy,不是Linux的cp
cmd /c的作用是执行后面的命令后自动退出cmd进程,这样就能调用Windows的内置命令了。
方法2:改用跨平台的os+shutil模块(更推荐)
既然是创建目录和复制文件这类基础操作,用os和shutil模块更省心,完全不需要依赖系统命令,跨Windows/Linux都能跑:
import sys import os import shutil script = sys.argv name = str(script[0]) print(name) for i in range(0,10): fold = 'Lombriz'+str(i) os.mkdir(fold) # 自动适配不同系统的目录创建逻辑 shutil.copy(name, fold) # 跨平台的文件复制方法
内容的提问来源于stack exchange,提问作者Jhonatan Zu
相关产品推荐
相关产品推荐

