2017-12-22 2 views
0

erwartete ich ein einfaches Skript, einen SQL-Skript aus Pythonsubprocess.call läuft nicht wie

subprocess.call([ 
    'sqlcmd', 
    '-S', 'server_name', 
    '-d', 'db name' 
    '-i', r'path to the script + script name' 
    ]) 

Der Python-Skript ohne Fehler läuft zu nennen, aber nie ruft der SQL-Skript. Ich kann das SQL-Skript über die Befehlszeile sqlcmd "path to the script + script name" ausführen und es funktioniert wie erwartet.

Ich kann eine gespeicherte Prozedur aufrufen, die subprocess Modul ohne Probleme verwenden,

subprocess.Popen([ 
     'sqlcmd', 
     '-S', 'server_name', 
     '-d', 'db name' 
     '-Q', 'exec stored procedure' 
    ]) 

aber ein separates Skript gibt Aufruf keine Ergebnisse. Ich habe versucht, einschließlich shell = True oder Popen verwenden, aber nichts ändert sich.

Um weitere Tests durchzuführen, habe ich ein Testskript erstellt, das nur den Namen der aktuellen Datenbank zurückgibt. Ich lief es ohne Probleme durch die Befehlszeile sqlcmd -S server_name -d db_name -i "directory/test1.sql", das erwartete Ergebnis erhalten. Ich habe versucht, es mit subprocess Modul zu starten und habe mein Problem erneut, habe ich versucht subprocess.call_check und habe einen Fehler unter Angabe exit status 1. Also das Skript läuft mit der Kommandozeile, aber nicht mit subprocess Modul.

+0

Was * passiert *? Erhalten Sie einen Fehler? Oder tut es einfach nichts? Sind Sie sicher, dass das Argument, das Sie an "-i" übergeben, korrekt ist? Hast du kontrolliert? – larsks

+0

Wenn ich 'print' Anweisungen vor und nach dem subprocess.call gebe, bekomme ich beide Anweisungen ausgedruckt, keine Fehler. Das Argument in "-i" ist korrekt, denn wenn ich genau dasselbe Argument über die Befehlszeile 'sqlcmd 'Pfad zum Skript + Skriptnamen' liefere, lasse ich das Skript laufen. Wenn das Argument in "-i" falsch war, würde ich einen Fehler erhalten. – AK9309

Antwort

1

Mein Problem war mit Verzeichnissen für SQL-Skript und das Python-Skript, obwohl ich den vollständigen Pfad für das SQL-Skript angegeben. Sie waren auf separaten Platten, und ich bekam immer non-zero exit status 1, wenn ich subprocess.call_check() verwenden würde. Ich habe beide Skripte an den gleichen Ort gebracht und das Problem ist weg.