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çãosubprocesso.run (["cat", "data.TXT"])
Executar o código acima retornará a seguinte saída:
nome = JohnCompletedProcess (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çãosubprocesso.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çãooutput = 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çãosubprocesso.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çãooutput = 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çãosubprocesso.run (dados "cat '.txt '", shell = True)
Executar o código acima produzirá a seguinte saída:
nome = JohnConclusã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.