我试图了解使用Python的库函数执行特定于操作系统的任务(例如创建文件/目录、更改文件属性等)背后的动机是什么,而不是仅仅通过执行这些命令os.system()
or subprocess.call()
?
例如,我为什么要使用os.chmod
而不是做os.system("chmod...")
?
我理解尽可能使用Python可用的库方法而不是直接执行shell命令更“Pythonic”。但是,从功能的角度来看,这样做还有其他动机吗?
我在这里只讨论执行简单的一行 shell 命令。当我们需要更多地控制任务的执行时,我理解使用subprocess
例如,模块更有意义。
It's faster, os.system
and subprocess.call
创建新的流程,这对于如此简单的事情来说是不必要的。实际上,os.system
and subprocess.call
与shell
参数通常会创建至少两个新进程:第一个是 shell,第二个是您正在运行的命令(如果它不是内置的 shell,例如test
).
一些命令是在单独的进程中无用。例如,如果您运行os.spawn("cd dir/")
,它将更改子进程的当前工作目录,但不会更改Python进程的当前工作目录。你需要使用os.chdir
为了那个原因。
你不用担心特殊情况字符解释通过外壳。os.chmod(path, mode)
无论文件名是什么都可以工作,而os.spawn("chmod 777 " + path)
如果文件名类似于; rm -rf ~
。 (请注意,如果您使用subprocess.call
没有shell
争论。)
你不必担心以破折号开头的文件名. os.chmod("--quiet", mode)
将更改名为的文件的权限--quiet
, but os.spawn("chmod 777 --quiet")
将会失败,因为--quiet
被解释为一个参数。即使对于subprocess.call(["chmod", "777", "--quiet"])
.
你少了跨平台和跨 shell 问题,因为 Python 的标准库应该为你处理这个问题。你的系统有吗chmod
命令?安装了吗?它支持您期望它支持的参数吗?这os
模块将尝试尽可能跨平台,并在不可能时进行记录。
如果您正在运行的命令有output你关心的文件,你需要解析它,这比听起来更棘手,因为你可能会忘记极端情况(其中包含空格、制表符和换行符的文件名),即使你不关心可移植性。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)