У меня есть база данных, которую я хочу создать резервную копию с помощью кода Python.
Я попытался основывать свой код на коде в этом обсуждении, который использует модуль подпроцесса и pg_dump
. Моя проблема сейчас в том, что мне нужно вручную ввести пароль, чтобы получить файл резервной копии. Я где-то читал, что выполняется .pgpass
, но я хочу посмотреть, возможно ли это сделать в модуле подпроцесса.
Мой код следует ниже:
from subprocess import Popen, PIPE
from pathlib import Path, PureWindowsPath
def backup():
version = 11
postgresDir = Path("C:/Program Files/PostgreSQL/{}/bin/".format(version))
directory = PureWindowsPath(postgresDir)
filename = 'myBackUp2' # output filename here
saveDir = Path("D:/Desktop/{}.tar".format(filename)) # output directory here
file = PureWindowsPath(saveDir)
host = 'localhost'
user = 'postgres'
port = '5434'
dbname = 'database_name' # database name here
proc = Popen(['pg_dump', '-h', host, '-U', user, '-W', '-p', port,
'-F', 't', '-f', str(file), '-d', dbname],
cwd=directory, shell=True, stdin=PIPE)
proc.wait()
backup()
Приведенный выше код работает, и резервная копия создается, если я ввожу пароль. Я попытался заменить proc.wait()
приведенным ниже кодом, чтобы избавиться от необходимости вводить пароль вручную:
return proc.communicate('{}\n'.format(database_password))
Но я бы получил эту ошибку:
TypeError: требуется байтовый объект, а не 'str'
Возможно ли это сделать в подпроцессе? Если да, то как?
text=True
к вызовуPopen()
. - person Boris   schedule 02.02.2019