Convertir un script de bash a python (script pequeño)

Tengo un script de bash que he estado usando para un entorno Linux, pero ahora tengo que usarlo en una plataforma de Windows y quiero convertir el script de bash en un script de python que puedo ejecutar.

El guión de bash es bastante simple (creo) y he intentado convertirlo en Google de manera aproximada, pero no puedo convertirlo con éxito.

El script de bash se ve así:

runs=5 queries=50 outfile=outputfile.txt date >> $outfile echo -e "\n---------------------------------" echo -e "\n----------- Normal --------------" echo -e "\n---------------------------------" echo -e "\n----------- Normal --------------" >> $outfile for ((r = 1; r > $outfile done 

El comando principal, python read.py … etc., es otro archivo de python que se me ha proporcionado y tiene los argumentos que ve.

Sé que es mucho pedir, pero realmente me ayudaría si alguien pudiera convertir esto en un script de python que pueda usar o al menos darme algunos consejos e instrucciones.

Sinceramente

Mestika

Añadido por solicitud:

Esto es lo que he escrito pero sin éxito:

 runs=5 queries=50 outfile=ReadsAgain.txt file = open("results.txt", "ab") print "\n---------------------------------" print "\n----------- Normal --------------" print "\n---------------------------------" file.write("\n----------- Normal --------------\n") print "\n------------- Query without Index --------------" file.write("\n------------- Query without Index --------------\n") for r = 1; r < (%s + 1); r++ % runs print "Run %s of %s \n" % r % runs db2 FLUSH PACKAGE CACHE DYNAMIC output = python reads.py -r1 -pquery1.sql -q$queries -shotelspec -k6 -a5 file.write(output) file.close() 

Debería ser bastante sencillo portar su progtwig. La única parte difícil será ejecutar el comando db2 y (quizás) refactorizar reads.py para que pueda llamarse como una función de biblioteca.

La idea básica es la misma:

  • Establecer variables locales es lo mismo.
  • Reemplace el echo con la print .
  • Reemplace su bucle con for r in range(runs):
  • Obtén la date con el módulo datetime .
  • Reemplace escribir en archivo con el módulo de objetos de archivo .
  • Reemplace la llamada a db2 con el módulo de subproceso .
  • Deberá import reads.py para usar como una biblioteca (o puede usar un subproceso).

Pero, como dice Marcelo, si quieres más ayuda, es mejor que hagas un esfuerzo para hacer preguntas directas.

Responder

Vamos a descomponerlo en pedazos. Especialmente las piezas que tienes mal. 🙂


Asignación

 outfile=ReadsAgain.txt 

No debería sorprenderte que tengas que poner comillas alrededor de las cadenas. Por otro lado, tiene el lujo de poner espacios alrededor de la = legibilidad.

 outfilename = "ReadsAgain.txt" 

Expansión variable → str.format (o, la operación % )

 python reads.py  -q$queries  

Así que ya sabes cómo hacer la redirección, pero ¿cómo haces la expansión de la variable? Puedes usar el método de format (v2.6 +):

 command = "python reads.py -r1 -pquery1.sql -q{0} -shotelspec -k6 -a5".format(queries) 

Alternativamente, puede usar el operador % :

 #since queries is a number, use %d as a placeholder command = "python reads.py -r1 -pquery1.sql -q%d -shotelspec -k6 -a5" % queries 

Bucle de estilo C → Bucle de estilo orientado a objetos

 for ((r = 1; r < ($runs + 1); r++)) do done 

Looping en Python es diferente de la iteración de estilo C. Lo que sucede en Python es iterar sobre un objeto iterable, como por ejemplo una lista. Aquí, usted está tratando de hacer algo por tiempo, por lo que haría esto:

 for r in range(runs): #loop body here 

range(runs) es equivalente a [0,1,...,runs-1] , una lista de runs = 5 elementos enteros. Así que estarás repitiendo el cuerpo runs tiempos. En cada ciclo, r se asigna el siguiente elemento de la lista. Esto es completamente equivalente a lo que estás haciendo en Bash.

Si te sientes atrevido, usa xrange en xrange lugar. Es completamente equivalente, pero utiliza funciones de lenguaje más avanzadas (por lo que es más difícil de explicar en términos sencillos) pero consume menos recursos.


Redireccionamiento de salida → el módulo de subprocess

La parte "más dura", si lo hace: ejecutar un progtwig y obtener su salida. Google al rescate! Obviamente, el éxito principal es una pregunta de stackoverflow: esta . Puede ocultar toda la complejidad detrás de él con una función simple:

 import subprocess, shlex def get_output_of(command): args = shlex.split(command) return subprocess.Popen(args, stdout=subprocess.PIPE).communicate()[0] # this only returns stdout 

Asi que:

 python reads.py -r1 -pquery1.sql -q$queries -shotelspec -k6 -a5 >> $outfile 

se convierte en:

 command = "python reads.py -r1 -pquery1.sql -q%s -shotelspec -k6 -a5" % queries read_result = get_output_of(command) 

No subprocess , las baterías están incluidas.

Opcionalmente, considere que puede obtener prácticamente la misma salida de date con lo siguiente:

 import time time_now = time.strftime("%c", time.localtime()) # Sat May 15 15:42:47 2010 

(Tenga en cuenta la ausencia de información de la zona horaria. Este debe ser el tema de otra pregunta , si es importante para usted).


Cómo debería verse tu progtwig

El resultado final debería verse así:

 import subprocess, shlex, time def get_output_of(command): #... body of get_output_of #... more functions ... if __name__ = "__main__": #only execute the following if you are calling this .py file directly, #and not, say, importing it #... initialization ... with file("outputfile.txt", "a") as output_file: #alternative way to open files, v2.5+ #... write date and other stuff ... for r in range(runs): #... loop body here ... 

Post scriptum

Debe parecer bastante horrible en comparación con el script de Bash relativamente simple y corto, ¿verdad? Python no es un lenguaje especializado: pretende hacer todo razonablemente bien, pero no está creado directamente para ejecutar progtwigs y obtener el resultado de esos.

Aún así, normalmente no escribirías un motor de base de datos en Bash, ¿verdad? Son diferentes herramientas para diferentes trabajos. Aquí, a menos que esté planeando hacer algunos cambios que no sería trivial escribir con ese lenguaje, [Ba] sh fue definitivamente la elección correcta.

Por mucho que esté a favor de escribir en Python en lugar de bash, si la única razón para convertirlo en Python es que pueda ejecutarlo en Windows, tenga en cuenta que puede instalar bash en Windows y ejecutarlo tal como está. Cygwin.com tiene una implementación completa de muchos comandos de Unix.