2010-09-09 15 views
10

Lo que me gustaría lograr es el lanzamiento de la siguiente comando shell:¿Ejecutar el comando de shell con las redirecciones de entrada de python 2.4?

mysql -h hostAddress -u userName -p userPassword 
databaseName < fileName 

Desde dentro de un script en Python 2.4 con algo no muy diferente:

cmd = ["mysql", "-h", ip, "-u", mysqlUser, dbName, "<", file] 
subprocess.call(cmd) 

Este vomita debido a la utilización de el símbolo de redirección (creo) - mysql no recibe el archivo de entrada.

También he intentado:

subprocess.call(cmd, stdin=subprocess.PIPE) 

sin ir allí éter

Puede alguien especificar la sintaxis para realizar una llamada concha tal que puedo alimentar en una redirección de archivos?

Gracias de antemano.

+0

debe utilizar una interfaz Python mysql en lugar de llamar al cliente mysql externo – ghostdog74

+0

@ user131527 La interfaz funcionaría en este caso sí. Estaba interesado en cómo redirigir el archivo dentro de python de todos modos y esto sirvió como un buen ejemplo – SMTF

Respuesta

11

Tienes que alimentar el archivo en mysql stdin por ti mismo. Esto debería hacerlo.

import subprocess 
... 
filename = ... 
cmd = ["mysql", "-h", ip, "-u", mysqlUser, dbName] 
f = open(filename) 
subprocess.call(cmd, stdin=f) 
4

El símbolo < tiene este significado (i. E. La lectura de un archivo a stdin) sólo en la cáscara. En Python que puedes usar cualquiera de los siguientes:

1) Leer el contenido del archivo en su proceso y lo empuja al stdin del proceso hijo:

fd = open(filename, 'rb') 
try: 
    subprocess.call(cmd, stdin=fd) 
finally: 
    fd.close() 

2) Leer el contenido del archivo a través de la cáscara (como usted ha mencionado), pero redirigir stdin de su proceso en consecuencia:

# In file myprocess.py 
subprocess.call(cmd, stdin=subprocess.PIPE) 

# In shell command line 
$ python myprocess.py < filename 
+1

Corrección menor: no hay una declaración 'with' en 2.4. – Constantin

+0

@Constantin Gracias. –

+0

Puede estar relacionado con mi configuración pero especificando el subproceso.PIPE como stdin recién colgado. Leer como archivo funcionó bien. ¡Gracias! – SMTF

0

Como notó correctamente Andrey, el operador < redirección es interpretada por shell. Por lo tanto otra posible solución:

import os 
os.system("mysql -h " + ip + " -u " + mysqlUser + " " + dbName) 

Funciona porque os.system pasa su argumento a la cáscara.

Tenga en cuenta que asumí que todas las variables utilizadas provienen de una fuente confiable, de lo contrario debe validarlas para evitar la ejecución de código arbitrario. Además, esas variables no deben contener espacios en blanco (valor predeterminado IFS) o caracteres especiales de shell.

+0

Eso hace que os.system suene mucho más conveniente que el subproceso. Me equivoqué al pensar que os.system estaba siendo desaprobado. Gracias por la respuesta. – SMTF

+0

Bueno, preferiría la solución de subproceso, es superior en varias formas (por ejemplo, debería ser más portátil). –

Cuestiones relacionadas