何时在 Python 中使用 运行 外部命令

When to run external commands in Python

在 Python 中,可以 运行 一个 bash 命令来实现一些可以通过 运行ning 等价的 Python 代码实现的东西。举一个简单的例子,要 cd 进入一个目录并做一些事情,你可以这样做:

import subprocess
subprocess.run('cd directory and do other stuff')

import os
os.chdir(path) # path is the path to the directory
#do other stuff

那么你如何选择使用哪一个(我的意思是一般情况下,而不是这个简化的例子)?

第一个版本只是改变了子进程的目录。它对原始 Python 进程没有影响,因此实际上没有用。只有当它是多个命令的一部分时才值得:

subprocess.run('cd directory; cat filename', shell=True)

第二个版本更改了 Python 进程本身的目录。

更一般地说,如果有一个 Python 函数与外部命令执行相同的操作,您应该更喜欢该函数。它更高效,因为它不必启动新进程,如果您使用 shell=True,它不必解析命令,并且您可以获得更灵活的错误处理。

我不会选择前者。它创建一个子进程并更改到该子进程内的目录,然后终止,使 Python 进程的当前目录与 subprocess.run 调用之前相同。

os.chdir实际上改变了当前进程的工作目录。这看起来很好,直到您开始使用线程并意识到一个线程的当前目录可能会受到来自另一个线程的 os.chdir 调用的影响。

对于单线程进程(Ingorant Wandered 一开始通常会写的那种)这没有问题。

更广泛地说,如果您需要比 Python 单独提供的更多并行性,则期望使用 subprocess 模块(研究“Python GIL”以找出为什么天真 Python进程只能使用多核计算机的一个核心。

尼日尔。 subprocess.run('cd directory') 刚刚更改了子进程的目录,然后退出,丢弃了已更改的目录上下文。 os.chdir(path) 并不总是精神错乱,只是 99% 精神错乱。您最好使用 os.pathpathlib 来跟踪目录,而不是在整个程序中更改“当前”的含义。

运行 外部命令有一个优势,特别是如果它们实现了您目前没有的功能。它们还可以帮助并行化您的代码,例如 运行 外部 grep 并使用其结果。这具有添加外部平台依赖项的缺点。

通常只是因为程序员碰巧比 python 更了解 shell。或者在网上找到一个 shell 例子。这对业余爱好者来说很好,而不是专业代码库。

免责声明:恕我直言