A resposta de @ milne funciona, mas subprocess.call()fornece 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 chamado
Observe que isso não invoca bashou outro shell, se você não especificar o shellargumento da palavra - chave para a função (o mesmo vale para subprocess.call(), e você não deve, se não for necessário, pois impõe um risco à segurança), invoca diretamente o comando.
Se você se deparar com muitas invocações de comando (diferentes) do Python, talvez queira ver 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()
É recomendável usar ( os.popenou os.system), ex res = os.popen('sudo apt update').read():? @Anthon
alper 08/08/18
1
@alper Leia 0324 python.org/dev/peps/pep-0324 . Isso explica a lógica de fazer, subprocessembora os.systeme os.popenjá existisse. Tais PEPs não são triviais para serem aceitos. Várias pessoas pensaram muito mais nisso do que você ou eu. E subprocessmelhorou desde 2003, os outros ainda estão lá para compatibilidade com versões anteriores. Você reded a os.systempágina do manual: O módulo de subprocesso fornece instalações mais poderosas para gerar novos processos e recuperar seus resultados; usar esse módulo é preferível a usar esta função.
Anthon
1
@alper Sim, você poderia. Como indiquei que é um risco potencial à segurança, não sei por que você acha que isso é recomendado. E invocar sudosó vai tornar isso mais grave. Talvez o uso de python-apt seja uma solução melhor (eu mesmo não examinei isso).
Anthon
1
@alper, nesse caso, dê uma olhada séria no prumo , vale a pena se familiarizar com isso.
Anthon
1
@alper Se você estiver no Python3, precisará fazer isso; no Python2, não. Por favor, não use os comentários aqui como um sistema de bate-papo. Se você tiver uma pergunta, publique-a como tal.
Anthon
8
É possível usar o bash como um programa, com o parâmetro -c para executar os comandos:
isso me deu o seguinte rastreio: Traceback (most recent call last): File "/home/Dremor/test.py", line 3, in <module> subprocess.call('sudo', 'yum', 'update') File "/usr/lib64/python3.4/subprocess.py", line 537, in call with Popen(*popenargs, **kwargs) as p: File "/usr/lib64/python3.4/subprocess.py", line 767, in __init__ raise TypeError("bufsize must be an integer") TypeError: bufsize must be an integer (estou usando o yum como estou usando o Fedora como sistema operacional principal) #
Dremor
3
Você esqueceu os colchetes
Milind Dumbare 16/03/2015
1
Também nota que subprocess.call()está bloqueando enquanto subprocess.Popen()é sem bloqueio ..
heemayl
O que você quer dizer com "bloqueio"? @heemayl
alper
2
Também você pode usar 'os.popen'.
Exemplo:
import os
command = os.popen('ls -al')print(command.read())print(command.close())
Resultado:
total 16
drwxr-xr-x 2 root root 4096 ago 1321:53.
drwxr-xr-x 4 root root 4096 ago 1301:50..-rw-r--r--1 root root 1278 ago 1321:12 bot.py
-rw-r--r--1 root root 77 ago 1321:53 test.py
None
Respostas:
A resposta de @ milne funciona, mas
subprocess.call()
fornece pouco feedback.Eu prefiro usar
subprocess.check_output()
para que você possa analisar o que foi impresso no stdout:check_output
gera um erro na saída zero do comando chamadoObserve que isso não invoca
bash
ou outro shell, se você não especificar oshell
argumento da palavra - chave para a função (o mesmo vale parasubprocess.call()
, e você não deve, se não for necessário, pois impõe um risco à segurança), invoca diretamente o comando.Se você se deparar com muitas invocações de comando (diferentes) do Python, talvez queira ver plumbum . Com isso você pode fazer o (IMO) mais legível:
fonte
os.popen
ouos.system
), exres = os.popen('sudo apt update').read()
:? @Anthonsubprocess
emboraos.system
eos.popen
já existisse. Tais PEPs não são triviais para serem aceitos. Várias pessoas pensaram muito mais nisso do que você ou eu. Esubprocess
melhorou desde 2003, os outros ainda estão lá para compatibilidade com versões anteriores. Você reded aos.system
página do manual: O módulo de subprocesso fornece instalações mais poderosas para gerar novos processos e recuperar seus resultados; usar esse módulo é preferível a usar esta função.sudo
só vai tornar isso mais grave. Talvez o uso de python-apt seja uma solução melhor (eu mesmo não examinei isso).É possível usar o bash como um programa, com o parâmetro -c para executar os comandos:
Exemplo:
fonte
O módulo do subprocesso foi projetado para fazer isso:
Se você deseja que o script seja encerrado se o comando falhar, considere usar em
check_call()
vez de analisar o código de retorno:fonte
Traceback (most recent call last): File "/home/Dremor/test.py", line 3, in <module> subprocess.call('sudo', 'yum', 'update') File "/usr/lib64/python3.4/subprocess.py", line 537, in call with Popen(*popenargs, **kwargs) as p: File "/usr/lib64/python3.4/subprocess.py", line 767, in __init__ raise TypeError("bufsize must be an integer") TypeError: bufsize must be an integer
(estou usando o yum como estou usando o Fedora como sistema operacional principal) #subprocess.call()
está bloqueando enquantosubprocess.Popen()
é sem bloqueio ..Também você pode usar 'os.popen'.
Exemplo:
Resultado:
fonte
usar módulo de subprocesso
fonte