Quand j'ai essayé d'exécuter psql indirectement en utilisant subprocess.check_output (), j'ai rencontré l'erreur "
psql: option invalide - '' '
". Je ne pouvais pas comprendre ce qui n'allait pas avec ce message seul, alors j'ai essayé différentes choses pour en découvrir la cause.
En conséquence, j'ai trouvé qu'il y avait un problème avec la façon de créer des arguments.
J'ai exécuté une commande en Python qui répertorie à distance les utilisateurs sur le serveur PostgreSQL.
Code de problème 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
Exécution de la commande (erreur)
[user001@localhost ~]$ python psql01.py
['psql', '-U postgres', '-d postgres', '-t ', '-c select * from pg_user;']
psql:Option invalide-- ' '
Le détail est"psql --help"S'il te plait regarde.
La méthode de création du deuxième argument de check_output () défini dans la variable cmd de l'exemple de code ci-dessus a été modifiée.
check_syntaxe de sortie
subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False)
Par exemple, lors de l'analyse d'une ligne de commande (avec getopt etc.) en langage bash ou C, il interprète les caractères vides comme des délimiteurs, mais check_output () semble avoir des éléments de liste comme éléments d'argument. Pour le dire mal, check_output () ne semble pas traiter les caractères vides comme des délimiteurs.
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: option invalide - '' '
" semble indiquer une erreur de syntaxe de'-t △' (caractère vide après t).Recommended Posts