我试图理解使用Python的库函数来执行操作系统特定的任务,如创建文件/目录,更改文件属性等,而不是只通过执行这些命令通过os.system()或subprocess.call() )?
例如,为什么要使用os.chmod而不是os.system(“chmod …”)?
我理解,更多的是“pythonic”使用Python的可用库方法尽可能,而不是只直接执行shell命令。但是,从功能的角度来看,还有其他动机吗?
我只是说在这里执行简单的单行shell命令。当我们需要更多地控制任务的执行时,我理解使用子进程模块更有意义,例如。
>它更快,os.system和subprocess.call创建新的进程,这是不必要的东西这个简单。事实上,带有shell参数的os.system和subprocess.call通常创建至少两个新进程:第一个是shell,第二个是你正在运行的命令(如果它不是shell内置的喜欢测试)。 >一些命令在单独的进程中是无用的。例如,如果运行os.spawn(“cd dir /”),它将更改子进程的当前工作目录,但不会更改Python进程的当前工作目录。你需要使用os.chdir。 >你不必担心shell解释的特殊字符。 os.chmod(path,mode)将工作,不管文件名是什么,而os.spawn(“chmod 777”路径)将失败可怕的,如果文件名是什么样的; rm -rf〜。 (注意,如果你使用没有shell参数的subprocess.call,你可以解决这个问题。) >你不必担心以破折号开头的文件名。 os.chmod(“ – quiet”,mode)将更改名为–quiet的文件的权限,但os.spawn(“chmod 777 –quiet”)将失败,因为–quiet被解释为参数。即使对于subprocess.call([“chmod”,“777”,“–quiet”])也是如此。 >你有更少的跨平台和跨shell关注,因为Python的标准库应该为你处理。你的系统有chmod命令吗?是否安装?它是否支持您期望它支持的参数? os模块将尽可能的跨平台和文档,当它是不可能的。 >如果你正在运行的命令有你所关心的输出,你需要解析它,这是比它听起来更棘手,因为你可能会忘记角落情况(文件名空格,制表符和换行符),甚至当你不在乎可移植性。