como executar um comando bash em um script python

9

Como posso iniciar um comando bash com vários argumentos (por exemplo " sudo apt update ") de um script python?

    
por Dremor 16.03.2015 / 15:00

5 respostas

11

@ resposta de milne funciona, mas subprocess.call() lhe dá pouco feedback.

Eu prefiro usar subprocess.check_output() para que você possa analisar o que foi impresso no stdout:

 import subprocess
 res = subprocess.check_output(["sudo", "apt", "update"])
 for line in res.splitlines():
     # process the output line by line

check_output gera um erro na saída zero do comando invocado

Por favor, note que isso não invoca bash ou outro shell se você não especificar o argumento shell para a função (o mesmo vale para subprocess.call() , e você não deveria se não for necessário como isso impõe um risco de segurança), ele invoca diretamente o comando.

Se você estiver fazendo muitas invocações de comando (diferentes) do Python, você pode querer olhar para plumbum . Com isso você pode fazer o (IMO) mais legível:

from plumbum.cmd import sudo, apt, echo, cut

res = sudo[apt["update"]]()
chain = echo["hello"] | cut["-c", "2-"]
chain()
    
por 16.03.2015 / 16:41
5

O módulo subprocesso foi projetado para fazer isso:

import subprocess
subprocess.call(["sudo", "apt", "update"])

Se você quiser que o script termine se o comando falhar, considere usar check_call() em vez de analisar o código de retorno você mesmo:

subprocess.check_call(["sudo", "apt", "update"])
    
por 16.03.2015 / 15:21
5

É possível usar o bash como um programa, com o parâmetro -c para executar os comandos:

Exemplo:

bashCommand = "sudo apt update"
output = subprocess.check_output(['bash','-c', bashCommand])
    
por 20.08.2015 / 06:30
0

Você também pode usar 'os.popen'.

Exemplo:

import os

command = os.popen('ls -al')
print(command.read())
print(command.close())

Saída:

total 16
drwxr-xr-x 2 root root 4096 ago 13 21:53 .
drwxr-xr-x 4 root root 4096 ago 13 01:50 ..
-rw-r--r-- 1 root root 1278 ago 13 21:12 bot.py
-rw-r--r-- 1 root root   77 ago 13 21:53 test.py

None
    
por 14.08.2018 / 07:44
0

use o módulo de subprocesso

import subprocess
command = 'sudo apt update'
subprocess.check_call(command.split())
    
por 08.06.2018 / 05:49