Pitão

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

Como executar comandos do shell em Python usando o método de execução de subprocesso
Subprocess é 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 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 opção de linha de comando associada ao binário. Este artigo explicará como usar o módulo de subprocesso e seu método de execução em aplicativos Python. Todos os exemplos de código no artigo são testados com Python 3.8.2 no Ubuntu 20.04.

O Subprocesso.Método de execução

O Subprocesso.o método run leva uma lista de argumentos. Quando o método é chamado, ele executa o comando e espera que o processo termine, retornando um objeto “CompletedProcess” no final. O objeto “CompletedProcess” retorna stdout, stderr, argumentos originais usados ​​ao chamar o método e um código de retorno. Stdout se refere ao fluxo de dados produzido pelo comando, enquanto stderr se refere a quaisquer erros levantados durante a execução do programa. Qualquer código de retorno diferente de zero (código de saída) significaria 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 irá gerar o conteúdo de um “data.arquivo txt ”, supondo que contenha uma string“ name = John ”.

subprocesso de importação
subprocesso.run (["cat", "data.TXT"])

Executar o código acima retornará a seguinte saída:

nome = John
CompletedProcess (args = ['cat', 'data.txt '], código de retorno = 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 opções de linha de comando. Você pode usar traço simples e traço duplo, também, para definir as opções. Por exemplo, para listar arquivos e pastas em um diretório, o código seria “subprocesso.executar ([“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 = subprocess.DEVNULL ”e“ stderr = subprocesso.DEVNULL ”como argumentos adicionais.

subprocesso de importação
subprocesso.run (["cat", "data.txt "], stdout = subprocesso.DEVNULL,
stderr = subprocesso.DEVNULL)

Executar o código acima produzirá a seguinte saída:

CompletedProcess (args = ['cat', 'data.txt '], código de retorno = 0)

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

Para capturar a saída do subprocesso.método de execução, use um argumento adicional chamado “capture_output = True”.

subprocesso de importação
output = subprocess.run (["cat", "data.txt "], capture_output = True)
imprimir (saída)

Executar o código acima produzirá a seguinte saída:

CompletedProcess (args = ['cat', 'data.txt '], código de retorno = 0,
stdout = b'name = John \ n ', stderr = b ")

Você pode acessar individualmente os valores stdout e stderr usando “output.stdout ”e“ output.métodos stderr ”. A saída é produzida como uma sequência de bytes. Para obter uma string como saída, use “output.stdout.método de decodificação (“utf-8”) ”. Você também pode fornecer “text = True” como um argumento extra para o subprocesso.execute uma chamada para obter a saída em formato de string. Para obter o código de status de saída, você pode usar o “output.método de código de retorno ”.

Exemplo 4: Gerar exceção na falha de comando executado pelo subprocesso.Método de execução

Para gerar uma exceção quando o comando sai com um status diferente de zero, use o argumento “check = True”.

subprocesso de importação
subprocesso.run (["cat", "data.tx "], capture_output = True, text = True, check = True)

Executar o código acima produzirá a seguinte saída:

aumentar CalledProcessError (recodificar, processar.args,
subprocesso.CalledProcessError: Comando '[' cat ',' data.tx ']'
retornou status de saída diferente de zero 1.

Exemplo 5: passar 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.método de execução usando o argumento “input = 'string'”.

subprocesso de importação
output = subprocess.run (["cat"], input = "data.txt ", capture_output = True,
text = True, check = True)
imprimir (saída)

Executar o código acima produzirá a seguinte saída:

CompletedProcess (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 aberto ("dados.txt ") como f:
output = subprocess.run (["cat"], stdin = f, capture_output = True,
text = True, check = True)
imprimir (saída)

Executar o código acima produzirá a seguinte saída:

CompletedProcess (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 divisão de string 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 de Python, pois o uso de “shell = True” pode levar a problemas de segurança. Você pode ler mais sobre as implicações de segurança aqui.

subprocesso de importação
subprocesso.run (dados "cat '.txt '", shell = True)

Executar o código acima produzirá a seguinte saída:

nome = John

Conclusão

O subprocesso.método run em Python é muito poderoso, pois permite que você execute comandos 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 de shell adicional em arquivos separados. Pode ser, no entanto, bastante complicado tokenizar corretamente os comandos do shell em uma lista python. Você pode usar o “shlex.split () ”método para tokenizar comandos shell simples, mas em comandos longos e complexos - especialmente aqueles com símbolos de barra vertical - shlex falha em dividir corretamente o comando. Nesses casos, a depuração pode ser um problema complicado. Você pode usar o argumento “shell = True” para evitar isso, mas existem certas questões de segurança associadas a esta ação.

Como capturar e transmitir sua sessão de jogo no Linux
No passado, jogar era considerado apenas um hobby, mas com o tempo a indústria de jogos viu um grande crescimento em termos de tecnologia e número de ...
Melhores jogos para jogar com rastreamento manual
Oculus Quest introduziu recentemente a grande ideia de rastreamento manual sem controladores. Com um número cada vez maior de jogos e atividades que e...
Como mostrar a sobreposição de OSD em aplicativos e jogos Linux em tela cheia
Jogar jogos em tela cheia ou usar aplicativos em modo de tela cheia sem distração pode cortar você das informações relevantes do sistema visíveis em u...