Резервное копирование Postgres из Python на Win10 - PullRequest
3 голосов
/ 07 августа 2020

Я пытаюсь сделать резервную копию Postgres из Python на Win10.

Я работаю над Anaconda python 3.8, машиной Win10 с локальным Postgres12. В переменной среды пути у меня есть postgres (lib и bin), без анаконды и python 3.8 (без анаконды).

Я могу правильно сделать резервную копию базы данных, используя командную оболочку окна :

pg_dump --dbname=postgresql://postgres:password@127.0.0.1:5432/test > C:\backup\dumpfile3.dump

но когда я запускаю его на anaconda:

os.system("pg_dump --dbname=postgresql://postgres:password@127.0.0.1:5432/test > C:\backup\dumpfile3.dump"  ) 

я получаю как вывод 1, ведьма - это код ошибки. Он создает файл, но он пуст.

Использование:

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))

Я получаю:

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"

Если я использую: subprocess.run или subprocess.call I не вызывает ошибки, но созданный файл пуст.

Похоже, что ни os.system, ни subprocess в интерпретаторе anaconda не получили доступа к переменным окружения в командной оболочке. Как это возможно? и как я могу это побороть ?. Разве другой пользователь вызывает оболочку?

Заранее спасибо.

1 Ответ

2 голосов
/ 11 августа 2020

Компьютер был перезагружен, и это решает проблему .... Пути не изменились, я считаю, что с момента установки вещей (python, postgres, ...) машина не перезагружалась.

import os
os.system("pg_dump --dbname=postgresql://postgres:password@127.0.0.1:5432/test > C:\backup\dumpfile3.dump" )

работало! , а также

import subprocess
subprocess.call(r"C:\some\path\backup.bat")

! Внутри backup.bat:

pg_dump pg_dump --dbname=postgresql://postgres:password@127.0.0.1:5432/test > C:\backup\dumpfile3.dump

Я полагаю, проблема заключалась в том, что интерпретатору anaconda требуется перезапуск системы, чтобы получить доступ к среде. переменные (там, где была переменная postgres), witch имеет очень мало смысла, поскольку 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" выглядит как консольное сообщение.

Если у кого-то есть лучшее объяснение, добро пожаловать.

...