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

我试图了解使用 Python 的库函数执行特定于操作系统的任务的动机是什么,例如创建文件/目录、更改文件属性等,而不是仅仅通过 os.system( )subprocess.call()?

例如,为什么我要使用 os.chmod 而不是 os.system("chmod...")

我知道尽可能地使用 Python 的可用库方法而不是直接执行 shell 命令更“pythonic”。但是,从功能的角度来看,这样做还有其他动机吗?

我这里只说执行简单的单行 shell 命令。当我们需要更多地控制任务的执行时,我知道使用 subprocess 模块更有意义,例如。

最佳答案

  1. fasteros.systemsubprocess.call 创建新进程,这对于这么简单的事情是不必要的。实际上,带有 shell 参数的 os.systemsubprocess.call 通常会创建至少两个新进程:第一个是 shell,第二个是您正在运行的命令(如果它不是像 test 这样的内置 shell)。

  2. 某些命令在单独的进程中无用。例如,如果你运行 os.spawn("cd dir/"),它会改变子进程的当前工作目录,但不会改变 Python 进程的工作目录。为此,您需要使用 os.chdir

  3. 您不必担心 shell 会解释特殊的字符os.chmod(path, mode) 无论文件名是什么都可以工作,而 os.spawn("chmod 777 "+ path) 如果文件名是类似 ; rm -rf ~。 (请注意,如果您使用不带 shell 参数的 subprocess.call,则可以解决此问题。)

  4. 您不必担心以破折号开头的文件名os.chmod("--quiet", mode)会改变名为--quiet的文件的权限,但是os.spawn("chmod 777 - -quiet") 将失败,因为 --quiet 被解释为参数。即使对于 subprocess.call(["chmod", "777", "--quiet"]) 也是如此。

  5. 您的跨平台 和跨shell 问题较少,因为Python 的标准库应该会为您处理这些问题。你的系统有 chmod 命令吗?安装了吗?它是否支持您期望它支持的参数? os 模块将尝试尽可能跨平台,并在不可能的情况下记录。

  6. 如果你正在运行的命令有你关心的输出,你需要解析它,这比听起来更棘手,因为你可能会忘记极端情况(文件名包含空格、制表符和换行符),即使您不关心可移植性。

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 - 从ssh注销后如何使程序继续运行?

linux - 确定 Linux 二进制文件的直接共享对象依赖关系?

python - 您需要安装 postgresql-server-dev-X.Y 来构建服务器端扩展

linux - 好的 Linux (Ubuntu) SVN 客户端

python - 如何打印字典的键?