Als ich versuchte, psql indirekt mit subprocess.check_output () auszuführen, stieß ich auf den Fehler "
psql: Ungültige Option - '' '
". Ich konnte nicht allein herausfinden, was mit dieser Nachricht falsch war, also habe ich verschiedene Dinge versucht, um die Ursache herauszufinden.
Als Ergebnis stellte ich fest, dass es ein Problem beim Erstellen von Argumenten gab.
Ich habe in Python einen Befehl ausgeführt, der Benutzer auf dem PostgreSQL-Server remote auflistet.
Problemcode psql01.py
#!/usr/bin/env python
import subprocess
cmd = [
'psql',
'-U ' + 'postgres',
'-d ' + 'postgres',
'-t ',
'-c ' + 'select * from pg_user;'
]
try:
result = subprocess.check_output(cmd, stderr=subprocess.STDOUT)
except subprocess.CalledProcessError as e:
result = e.output
print result
Befehlsausführung (Fehler)
[user001@localhost ~]$ python psql01.py
['psql', '-U postgres', '-d postgres', '-t ', '-c select * from pg_user;']
psql:Ungültige Option-- ' '
Detail ist"psql --help"Bitte sehen Sie.
Die Methode zum Erstellen des zweiten Arguments von check_output (), das in der cmd-Variablen des obigen Beispielcodes festgelegt ist, wurde geändert.
check_Ausgabesyntax
subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False)
Wenn Sie beispielsweise eine Befehlszeile (mit getopt usw.) in Bash- oder C-Sprache analysieren, werden leere Zeichen als Trennzeichen interpretiert, aber check_output () scheint Listenelemente als Argumentelemente zu haben. Um es schlecht auszudrücken, check_output () scheint Leerzeichen nicht als Trennzeichen zu behandeln.
cmd = [
'psql',
'-U' , 'postgres',
'-d' , 'postgres',
'-t',
'-c' , 'select * from pg_user;'
]
cmd = [
'psql',
'-U' + 'postgres',
'-d' + 'postgres',
'-t',
'-c' + 'select * from pg_user;'
]
psql: Invalid option-- '" `" scheint auf einen Syntaxfehler mit' -t △ '(ein leeres Zeichen nach t) hinzuweisen.Recommended Posts