【发布时间】:2019-06-26 16:45:13
【问题描述】:
我有一个数据库,我想用我的 python 代码备份。
我试图以this discussion 中使用子进程模块和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'
这可以在子流程中进行吗?如果有,怎么做?
【问题讨论】:
-
在
Popen()调用中添加text=True参数。 -
或者您可以以字节而不是字符串的形式传递密码。
标签: python python-3.x postgresql subprocess pg-dump