为什么要使用Python的os模块方法而不是直接执行shell命令?

问题:

我试图理解使用Python的库函数执行特定于操作系统的任务(如创建文件/目录,更改文件属性等)的动机是什么,而不是通过os.system()subprocess.call()执行这些命令,
例如,为什么要使用os.chmod而不是os.system("chmod...")
我明白,尽可能多的使用Python可用的库方法,而不是直接执行shell命令是更“pythonic”的。但是,从功能的角度来看,还有其他的动机呢?
我只是在谈论在这里执行简单的一行shell命令。当我们需要更多的控制任务的执行时,我明白使用subprocess模块比较有意义。

回答:

  1. 更快os.systemsubprocess.call创建新的进程,这对于这个简单的东西是不必要的。事实上,os.systemsubprocess.callshell参数通常至少创建两个新进程:第一个是shell,第二个是你正在运行的命令(如果它不是一个shell) – 像test)。
  2. 一些命令是在一个单独的过程中无用。例如,如果您运行os.spawn("cd dir/"),它将更改子进程的当前工作目录,而不是Python进程。您需要使用os.chdir
  3. 你不必担心shell的特殊字符解释。无论文件名是什么,os.chmod(path, mode)将工作,而如果文件名类似于; rm -rf ~,则os.spawn("chmod 777 " + path)将失败。 (请注意,如果您使用subprocess.call而不使用shell参数,则可以解决此问题。)
  4. 你不用担心以破折号开头的文件名os.chmod("--quiet", mode)将更改名为--quiet的文件的权限,但os.spawn("chmod 777 --quiet")将失败,因为--quiet被解释为参数。即使subprocess.call(["chmod", "777", "--quiet"])也是如此
  5. 你有更少的跨平台和跨shell的关注,因为Python的标准库应该为你处理。您的系统是否具有chmod命令?是否安装?它是否支持您期望它支持的参数? os模块将尽可能地跨平台,并且在不可能的情况下进行文档化。
  6. 如果你正在运行的命令是产量,你需要解析它,这比它听起来更棘手,因为你可能会忘记角落(带有空格,制表符和换行符的文件名),甚至当你不关心可移植性。

 
 Code问答: codewenda.com
Stackoverflow:Why use Python’s os module methods instead of executing shell commands directly?

发表评论

电子邮件地址不会被公开。 必填项已用*标注

26 + = 36