Когда запускать внешние команды в Python - PullRequest
0 голосов
/ 10 июля 2020

В 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

Итак, как выбрать, какой из них использовать ( Я имею в виду в общем, а не на этом упрощенном примере)?

Ответы [ 3 ]

1 голос
/ 10 июля 2020

Я бы не стал выбирать первое. Он создает подпроцесс и изменяет каталог внутри этого подпроцесса, который затем завершается, оставляя текущий каталог процесса Python таким же, каким он был до вызова subprocess.run.

os.chdir фактически изменяет рабочий каталог текущего процесса. Что кажется прекрасным, пока вы не начнете использовать потоки и не поймете, что на текущий каталог одного потока может повлиять вызов os.chdir из другого потока.

Для однопоточных процессов (тип, который Ingorant Wandered обычно записывает изначально) это не вызывает проблем. процессы могут использовать только одно ядро ​​многоядерного компьютера).

1 голос
/ 10 июля 2020

Ниетер. subprocess.run('cd directory') просто изменил каталог подпроцесса, который затем завершился, отбросив контекст измененного каталога. os.chdir(path) не всегда безумие, просто безумие на 99%. Лучше использовать os.path или pathlib для отслеживания каталогов и не менять значение слова «текущий» во всей программе.

Использование внешних команд дает преимущество, особенно если они реализуют функции, которые вы не используете. нет в данный момент. Они также могут помочь распараллелить ваш код, например, запустить внешний grep и использовать его результаты. Недостатком этого является добавление внешних зависимостей платформы.

Часто это происходит только потому, что программист понимает оболочку лучше, чем python. Или нашел пример оболочки на net. Это нормально для любителя, не имеющего профессиональной базы кода.

Отказ от ответственности: IMHO

1 голос
/ 10 июля 2020

Первая версия просто изменяет каталог подпроцесса. Это не влияет на исходный процесс Python, поэтому практически бесполезно. Было бы полезно, если бы он был частью нескольких команд:

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

Вторая версия изменяет каталог самого процесса Python.

В более общем смысле, если есть Python функция, которая выполняет то же самое, что и внешняя команда, вам следует предпочесть эту функцию. Это более эффективно, так как ему не нужно запускать новый процесс, ему не нужно анализировать команду, если вы используете shell=True, и вы получаете более гибкую обработку ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...