PDA

Visualizza la versione completa : [Python] Problema esecuzione comando e locazione file


fermat
05-05-2017, 16:12
ciao!

sto cercando di eseguire un comando passando il path del file dinamicamente.
questa la classe:


from subprocess import call
import sys


class ImportSql:
def execImport(self, fileSql):
try:
call("mysql -u UTENTE -pPWD DB_NAME < " + fileSql)
except BaseException as ex:
print(fileSql)
print(ex)
sys.exit()

e questo come richiamo il file:


from ImportSql import *

if __name__ == '__main__':
imp = ImportSql()
imp.execImport('C:\\file.sql')

il file c'è, lo vedo!!
eppure mi esce questo errore:


C:\file.sql
[WinError 2] The system cannot find the file specified

sinceramente non riesco a capire dove sbaglio!

fermat
05-05-2017, 16:30
allora, il primo problema stava nel fatto che mysql non era nel path delle variabili di sistema.
adesso l'ho impostato, ed il comando viene eseguito.

solo che mi da errore sulle opzioni.
sono andato sulla pagina del modulo subprocess, ed ho visto che le opzioni andrebbero divise.
solo che non come suddividere gli argomenti.
ho provato così, ma ottengo l'errore di mysql:


subprocess.run(["mysql", "-u", "USER", "-pPWD", "DB_NAME", " < " + fileSql])

fermat
08-05-2017, 16:43
ho fatto un altro pò di prove.
ad esempio questa:


from subprocess import Popen, PIPE
import sys


class ImportSql:
def execImport(self, fileSql):
try:
proc = Popen(["mysql", "DB_NAME", "-u", "USER", "-pPASSWORD"], stdin=PIPE, stdout=PIPE)
proc.communicate('source ' + fileSql)[0]
except BaseException as ex:
print("ERROR:", ex)
sys.exit()

ma ottengo questo errore:


ERROR: a bytes-like object is required, not 'str'

quindi va in eccezione, ma il messaggio non l'ho ben capito....

fermat
11-05-2017, 21:30
dopo 2000 tentativi ho fatto diversamente.
l'istruzione per l'import di mysql lo lancio da .bat.
da python lancio il bat senza parametri.
così funzione, e al momento mi va bene così.
:ciauz:

MItaly
11-05-2017, 22:22
Il secondo codice era quasi corretto, l'errore deriva dal fatto che hai cercato di comunicare con il processo passando una stringa (che in Python 3 è una sequenza di caratteri Unicode), mentre per comunicare su stdin/stdout si lavora con sequenze di byte. Per convertire una stringa in sequenza di byte devi usare il metodo encode() (di default usa l'encoding "di sistema", che nel tuo caso dovrebbe andare bene, in altri casi può essere necessario specificare l'encoding da usare).


proc.communicate(('source ' + fileSql).encode())[0]

fermat
12-05-2017, 09:39
grazie, appena posso provo a fare come dici te!!

Loading