我正在尝试理解使用Python库函数来执行特定于操作系统的任务背后的动机,比如创建文件/目录、更改文件属性等,而不是仅仅通过os.system()
或subprocess.call()
执行这些命令
例如,为什么我要使用os.chmod
而不是os.system("chmod...")
?
我知道尽可能多地使用Python的可用库方法比直接执行shell命令更具“Python风格”。但是,从功能的角度来看,这样做背后还有其他动机吗?
我在这里只是在谈论执行简单的一行shell命令。例如,当我们需要对任务的执行进行更多的控制时,我理解使用subprocess
模块更有意义。
发布于 2015-02-18 07:10:04
这样更安全。为了给你一个概念,这里是一个示例脚本
import os
file = raw_input("Please enter a file: ")
os.system("chmod 777 " + file)
如果来自用户的输入是test; rm -rf ~
,这将删除主目录。
这就是为什么使用内置函数更安全的原因。
这也是为什么你应该使用子进程而不是系统。
发布于 2015-02-18 07:47:46
Shell调用是特定于操作系统的,而Python OS模块函数在大多数情况下不是。而且它避免了派生一个子进程。
发布于 2015-02-18 19:23:11
效率要高得多。"shell“只是包含大量系统调用的另一个操作系统二进制文件。为什么要为单个系统调用而产生创建整个shell进程的开销?
当你将os.system
用于非内置外壳的东西时,情况就更糟了。您启动一个shell进程,该进程又启动一个可执行文件,然后(两个进程相隔)进行系统调用。至少subprocess
已经消除了对外壳中介进程的需求。
这并不是特定于Python的。出于同样的原因,systemd
是对Linux启动时间的改进:它自己进行必要的系统调用,而不是产生上千个shell。
https://stackoverflow.com/questions/28572833
复制相似问题