2010-09-09 8 views
10

Quello che mi piacerebbe raggiungere è il lancio del seguente comando shell:Esegui il comando shell con i reindirizzamenti di input da python 2.4?

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

Dall'interno di un 2,4 script python con qualcosa di non dissimile:

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

Questo vomita a causa dell'uso di il simbolo di reindirizzamento (credo) - mysql non riceve il file di input.

Ho anche provato:

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

non andarci etere

Qualcuno può specificare la sintassi per effettuare una chiamata shell tale che posso nutrire in un reindirizzamento di file?

Grazie in anticipo.

+0

dovresti usare un'interfaccia mysql Python invece di chiamare un client mysql esterno – ghostdog74

+0

@ user131527 L'interfaccia funzionerebbe in questo caso sì. Ero interessato a reindirizzare il file da python in ogni caso e questo è servito come buon esempio – SMTF

risposta

11

Devi alimentare il file in mysql stdin da solo. Questo dovrebbe farlo.

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

Il simbolo < ha questo significato (i. E. La lettura di un file da stdin) solo in guscio. In Python si consiglia di utilizzare una delle seguenti operazioni:

1) Leggere il contenuto dei file nel vostro processo e spingerlo a stdin del processo figlio:

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

2) Leggere il contenuto dei file attraverso la shell (come lei ha ricordato), ma reindirizzare stdin del processo di conseguenza:

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

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

Correzione minore: non c'è alcuna istruzione 'with' in 2.4. – Constantin

+0

@ Grazie Constantin. –

+0

Potrebbe essere correlato alla mia configurazione ma specificando subprocess.PIPE come stdin appena bloccato. Leggere come un file ha funzionato bene. Grazie! – SMTF

0

Come Andrey correttamente notato, l'operatore < reindirizzamento viene interpretato dalla shell. Quindi un'altra soluzione possibile:

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

Funziona perché os.system passa il suo argomento nel guscio.

Si presume che tutte le variabili utilizzate provengano da una fonte attendibile, altrimenti è necessario convalidarle per impedire l'esecuzione di codice arbitrario. Inoltre, queste variabili non devono contenere spazi bianchi (valore predefinito IFS) o caratteri speciali della shell.

+0

Ciò rende l'audio os.system molto più conveniente del sottoprocesso. Mi sono sbagliato a pensare che os.system fosse deprecato. Grazie per la risposta. – SMTF

+0

Beh, preferirei una soluzione di sottoprocesso, è superiore in vari modi (ad esempio dovrebbe essere più portabile). –

Problemi correlati