我试图了解使用 Python 的库函数执行特定于操作系统的任务的动机是什么,例如创建文件/目录、更改文件属性等,而不是仅仅通过 os.system( )
或 subprocess.call()
?
例如,为什么我要使用 os.chmod
而不是 os.system("chmod...")
?
我知道尽可能地使用 Python 的可用库方法而不是直接执行 shell 命令更“pythonic”。但是,从功能的角度来看,这样做还有其他动机吗?
我这里只说执行简单的单行 shell 命令。当我们需要更多地控制任务的执行时,我知道使用 subprocess
模块更有意义,例如。
最佳答案
faster,os.system
和 subprocess.call
创建新进程,这对于这么简单的事情是不必要的。实际上,带有 shell
参数的 os.system
和 subprocess.call
通常会创建至少两个新进程:第一个是 shell,第二个是您正在运行的命令(如果它不是像 test
这样的内置 shell)。
某些命令在单独的进程中无用。例如,如果你运行 os.spawn("cd dir/")
,它会改变子进程的当前工作目录,但不会改变 Python 进程的工作目录。为此,您需要使用 os.chdir
。
您不必担心 shell 会解释特殊的字符。 os.chmod(path, mode)
无论文件名是什么都可以工作,而 os.spawn("chmod 777 "+ path)
如果文件名是类似 ; 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
模块将尝试尽可能跨平台,并在不可能的情况下记录。
如果你正在运行的命令有你关心的输出,你需要解析它,这比听起来更棘手,因为你可能会忘记极端情况(文件名包含空格、制表符和换行符),即使您不关心可移植性。
https://stackoverflow.com/questions/28572833/
相关文章:
python - 在 Python 中写入 UTF-8 文件
python - super() 失败并出现错误 : TypeError "argument 1 m
python - 如何在 python-3.x 中使用字典格式化字符串?
python - 为什么我不能在 python 中创建一个轮子?
python - 在 Python 中获取大文件的 MD5 哈希
linux - 确定 Linux 二进制文件的直接共享对象依赖关系?
python - 您需要安装 postgresql-server-dev-X.Y 来构建服务器端扩展