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