Estoy tratando de hacer una copia de seguridad de Postgres desde Python en Win10.
Estoy trabajando en Anaconda python 3.8, máquina Win10 con Postgres12 local. En la variable de entorno de la ruta, tengo postgres (lib y bin), no anaconda y python 3.8 (no la anaconda).
Puedo hacer una copia de seguridad correcta de la base de datos usando el shell de comandos de Windows:
pg_dump --dbname=postgresql://postgres:password@127.0.0.1:5432/test > C:\backup\dumpfile3.dumppero cuando lo ejecuto en anaconda:
os.system("pg_dump --dbname=postgresql://postgres:password@127.0.0.1:5432/test > C:\backup\dumpfile3.dump" ) Obtengo como salida 1 , que es un código de error. Crea el archivo, pero está vacío.
Utilizando:
import subprocess stk= 'pg_dump --dbname=postgresql://postgres:password@127.0.0.1:5432/test > C:\backup\dumpfile3.dump' try: subprocess.check_output(stk, shell=True, stderr=subprocess.STDOUT) except subprocess.CalledProcessError as e: raise RuntimeError("command '{}' return with error (code {}): {}".format(e.cmd, e.returncode, e.output))Yo obtengo :
RuntimeError: command 'pg_dump --dbname=postgresql://postgres:password@127.0.0.1:5432/test > C:\backup\dumpfile3.dump' return with error (code 1): b"'pg_dump' is not recognized as an internal or external command,\r\noperable program or batch file.\r\n" Si uso: subprocess.run o subprocess.call , no me da error, pero el archivo creado está vacío.
Parece que ni os.system ni el subprocess en el intérprete de anaconda obtuvieron acceso a las variables de entorno en el shell de comandos. ¿Cómo es esto posible? y como puedo superarlo?. ¿Es diferente el usuario que invoca el shell?
Gracias por adelantado.
La computadora se reinició y solucionó el problema... . No hubo cambios en las rutas, creo que desde el momento en que se instalaron las cosas (python, postgres, ...), la máquina no se ha reiniciado.
import os os.system("pg_dump --dbname=postgresql://postgres:password@127.0.0.1:5432/test > C:\backup\dumpfile3.dump" )trabajado!, y
import subprocess subprocess.call(r"C:\some\path\backup.bat")también funcionó!. Dentro de backup.bat está:
pg_dump pg_dump --dbname=postgresql://postgres:password@127.0.0.1:5432/test > C:\backup\dumpfile3.dump Me imagino que el problema era que el intérprete de anaconda necesitaba un reinicio del sistema para obtener acceso a las variables de entorno (donde estaba la variable de postgres), lo que tiene muy poco sentido como return with error (code 1): b"'pg_dump' is not recognized as an internal or external command,\r\noperable program or batch file.\r\n" visto como un mensaje de consola.
Si alguien tiene una mejor explicación, es bienvenido.