Como executar comandos de shell em python usando o método de execução do subprocesso

Como executar comandos de shell em python usando o método de execução do subprocesso
O subprocesso é um módulo Python embutido que pode ser usado para criar novos processos e interagir com seus fluxos de dados de entrada e saída. Em termos mais simples, você pode usá -lo para executar comandos do shell e executar binários executáveis ​​geralmente espalhados em várias pastas "bin" em um sistema de arquivos Linux. Você também pode fornecer um caminho completo para um binário executável e usar qualquer interruptor de linha de comando associado ao binário. Este artigo explicará como usar o módulo de subprocesso e seu método de execução em aplicativos Python. Todas as amostras de código no artigo são testadas com Python 3.8.2 no Ubuntu 20.04.

O subprocesso.Método de execução

O subprocesso.O método de execução leva uma lista de argumentos. Quando o método é chamado, ele executa o comando e aguarda que o processo termine, devolvendo um objeto "Concluído" no final. O objeto “Concluído do Processo” retorna stdout, stderr, argumentos originais usados ​​enquanto chamam o método e um código de retorno. STDOUT refere -se ao fluxo de dados produzido pelo comando, enquanto o Stderr refere -se a quaisquer erros levantados durante a execução do programa. Qualquer código de retorno diferente de zero (código de saída) significaria um erro com o comando executado no subprocesso.Método de execução.

Exemplo 1: Conteúdo de saída de um arquivo de texto usando o subprocesso.Método de execução

O comando abaixo produzirá o conteúdo de um “dados.arquivo txt ”, assumindo que ele contém uma string" nome = john ".

Subprocess de importação
subprocesso.executar (["gato", "dados.TXT"])

A execução do código acima retornará a seguinte saída:

Nome = John
ConclitedProcess (args = ['cat', 'dados.txt '], returncode = 0)

O primeiro elemento do argumento da lista é o nome do comando a ser executado. Qualquer elemento na lista que segue o primeiro elemento é considerado opções ou interruptores da linha de comando. Você também pode usar traços duplos e duplos para definir as opções. Por exemplo, para listar arquivos e pastas em um diretório, o código seria “subprocess.Run (["LS", "-l"] ". Na maioria desses casos, você pode considerar qualquer argumento separado por espaço em um comando shell como um elemento individual na lista fornecida ao subprocesso.Método de execução.

Exemplo 2: suprimir a saída do subprocesso.Método de execução

Para suprimir a saída do subprocesso.Método de execução, você terá que fornecer “STDOUT = subprocesso.DevNull "e" stderr = subprocesso.DevNull ”como argumentos adicionais.

Subprocess de importação
subprocesso.executar (["gato", "dados.txt "], stdout = subprocesso.DevNull,
stderr = subprocesso.DevNull)

A execução do código acima produzirá a seguinte saída:

ConclitedProcess (args = ['cat', 'dados.txt '], returncode = 0)

Exemplo 3: Capture a saída do subprocesso.Método de execução

Para capturar a saída do subprocesso.Executar o método, use um argumento adicional chamado "capture_output = true".

Subprocess de importação
saída = subprocesso.executar (["gato", "dados.txt "], capture_output = true)
Imprimir (saída)

A execução do código acima produzirá a seguinte saída:

ConclitedProcess (args = ['cat', 'dados.txt '], returncode = 0,
stdout = b'name = John \ n ', stderr = b ")

Você pode acessar individualmente os valores de stdout e stderr usando “saída.stdout "e" saída.Métodos Stderr ”. A saída é produzida como uma sequência de bytes. Para obter uma string como saída, use “saída.stdout.Decode (Método "UTF-8") ". Você também pode fornecer "text = true" como um argumento extra para o subprocesso.Execute a chamada para obter a saída no formato da string. Para obter o código de status de saída, você pode usar a “saída.Método ReturnCode ”.

Exemplo 4: Levante a exceção sobre a falha do comando executada pelo subprocesso.Método de execução

Para aumentar uma exceção quando o comando sair com um status diferente de zero, use o argumento "check = true".

Subprocess de importação
subprocesso.executar (["gato", "dados.tx "], capture_output = true, text = true, check = true)

A execução do código acima produzirá a seguinte saída:

Raise chamadoProcessError (Retcode, Process.args,
subprocesso.CHAMADO PROCOCESError: Command '[' Cat ',' Dados.tx ']' '
Retornado Status de saída diferente de zero 1.

Exemplo 5: Passe uma string para o comando executado pelo subprocesso.Método de execução

Você pode passar uma string para o comando a ser executado pelo subprocesso.Executar o método usando o argumento "input = 'string'".

Subprocess de importação
saída = subprocesso.Run (["Cat"], input = "Dados.txt ", capture_output = true,
texto = true, check = true)
Imprimir (saída)

A execução do código acima produzirá a seguinte saída:

ConclitedProcess (args = ['Cat'], ReturnCode = 0, STDOUT = 'Dados.txt ', stderr = ")

Como você pode ver, o código acima passa “dados.txt ”como uma string e não como um objeto de arquivo. Para passar “dados.txt ”como um arquivo, use o argumento“ stdin ”.

com open ("dados.txt ") como f:
saída = subprocesso.Run (["Cat"], stdin = f, capture_output = true,
texto = true, check = true)
Imprimir (saída)

A execução do código acima produzirá a seguinte saída:

ConclitedProcess (args = ['cat'], returncode = 0, stdout = 'nome = John \ n', stderr = ")

Exemplo 6: Execute o comando diretamente no shell usando o subprocesso.Método de execução

É possível executar um comando diretamente em um shell "como está", em vez de usar uma string dividida no comando principal e as opções que o seguem. Para fazer isso, você deve passar "shell = true" como um argumento adicional. No entanto, isso é desencorajado pelos desenvolvedores do Python, pois o uso de "shell = true" pode levar a problemas de segurança. Você pode ler mais sobre implicações de segurança daqui.

Subprocess de importação
subprocesso.Run (dados "CAT '.txt '", shell = true)

A execução do código acima produzirá a seguinte saída:

Nome = John

Conclusão

O subprocesso.O método de execução no Python é bastante poderoso, pois permite executar comandos de shell dentro do próprio Python. Isso ajuda a limitar todo o código ao próprio Python sem a necessidade de ter código de script adicional de shell em arquivos separados. Pode ser, no entanto, bastante complicado de tokenizar corretamente os comandos de shell em uma lista de Python. Você pode usar o “shlex.Método Split () ”para tokenizar comandos de shell simples, mas em comandos longos e complexos - especialmente aqueles com símbolos de tubo - o shlex falha em dividir corretamente o comando. Nesses casos, a depuração pode ser uma questão complicada. Você pode usar o argumento "shell = true" para evitar isso, mas existem certas preocupações de segurança associadas a esta ação.