Respuestas:
El módulo de subproceso lo ayudará.
Ejemplo descaradamente trivial:
>>> import subprocess
>>> subprocess.call(['./test.sh']) # Thanks @Jim Dennis for suggesting the []
0
>>>
Donde test.sh
es un script de shell simple y 0
es su valor de retorno para esta ejecución.
chmod +x script.sh
. Nota: script.sh es un marcador de posición para su script, reemplácelo en consecuencia.
Hay algunas formas de usar os.popen()
(en desuso) o todo el subprocess
módulo, pero este enfoque
import os
os.system(command)
Es uno de los más fáciles.
subprocess
usted puede administrar tuberías de entrada / salida / error. También es mejor cuando tiene muchos argumentos, os.command()
ya que tendrá que crear una línea de comando completa con caracteres especiales de escape, con subprocess
una simple lista de argumentos. Pero para tareas simples os.command()
puede ser suficiente.
The subprocess module provides more powerful facilities for spawning new processes and retrieving their results; *using that module is preferable to using this function.*
En caso de que desee pasar algunos parámetros a su script de shell, puede usar el método shlex.split () :
import subprocess
import shlex
subprocess.call(shlex.split('./test.sh param1 param2'))
con test.sh
en la misma carpeta:
#!/bin/sh
echo $1
echo $2
exit 0
Salidas:
$ python test.py
param1
param2
import os
import sys
Suponiendo que test.sh es el script de shell que desea ejecutar
os.system("sh test.sh")
Utilice el módulo de subproceso como se mencionó anteriormente.
Lo uso así:
subprocess.call(["notepad"])
Estoy ejecutando python 3.5 y subprocess.call (['./ test.sh']) no funciona para mí.
Te doy tres soluciones depende de lo que quieras hacer con la salida.
1 - guión de llamada. Verá la salida en su terminal. La salida es un número.
import subprocess
output = subprocess.call(['test.sh'])
2 - ejecución de llamada y volcado y error en cadena. No ve la ejecución en su terminal a menos que imprima (stdout). Shell = Verdadero ya que el argumento en Popen no funciona para mí.
import subprocess
from subprocess import Popen, PIPE
session = subprocess.Popen(['test.sh'], stdout=PIPE, stderr=PIPE)
stdout, stderr = session.communicate()
if stderr:
raise Exception("Error "+str(stderr))
3 - llama al script y volca los comandos echo de temp.txt en temp_file
import subprocess
temp_file = open("temp.txt",'w')
subprocess.call([executable], stdout=temp_file)
with open("temp.txt",'r') as file:
output = file.read()
print(output)
No olvides echar un vistazo al subproceso de documentación
El módulo de subproceso es un buen módulo para iniciar subprocesos. Puede usarlo para llamar a comandos de shell como este:
subprocess.call(["ls","-l"]);
#basic syntax
#subprocess.call(args, *)
Puedes ver su documentación aquí.
Si tiene su script escrito en algún archivo .sh o en una cadena larga, puede usar el módulo os.system. Es bastante simple y fácil llamar:
import os
os.system("your command here")
# or
os.system('sh file.sh')
Este comando ejecutará el script una vez, hasta su finalización, y lo bloqueará hasta que salga.
En caso de que el script tenga múltiples argumentos
#!/usr/bin/python
import subprocess
output = subprocess.call(["./test.sh","xyz","1234"])
print output
La salida dará el código de estado. Si el script se ejecuta con éxito, dará 0, de lo contrario, un número entero distinto de cero
podname=xyz serial=1234
0
A continuación se muestra el script de shell test.sh.
#!/bin/bash
podname=$1
serial=$2
echo "podname=$podname serial=$serial"
El subproceso es bueno, pero a algunas personas les puede gustar más la escritura . Scriptine tiene más conjunto de métodos de alto nivel como shell.call (args) , path.rename (new_name) y path.move (src, dst) . La escritura se basa en subprocesos y otros.
Dos inconvenientes de la escritura:
Sé que esta es una pregunta antigua, pero me topé con esto recientemente y terminó por desviarme desde la API de subproceso , modificada desde Python 3.5.
La nueva forma de ejecutar scripts externos es con la run
función, que ejecuta el comando descrito por args. Espera a que se complete el comando y luego devuelve una instancia de CompletedProcess.
import subprocess
subprocess.run(['./test.sh'])