繁体   English   中英

何时在 Python 中运行外部命令

[英]When to run external commands in Python

在 Python 中,可以运行 bash 命令来实现可以通过运行等效的 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 function 与外部命令执行相同的操作,您应该更喜欢 function。 它更高效,因为它不必启动新进程,如果使用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 的例子。 这对于业余爱好者而不是专业代码库来说很好。

免责声明:恕我直言

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM