【发布时间】:2020-09-05 15:44:11
【问题描述】:
我正在尝试为 PostgreSQL 数据库创建一个自动 pg 转储备份脚本。该脚本要求输入数据库密码。我正在尝试使用标准输入输入密码。但是,它不起作用。 'popen.stdin.write("rootpasswordhere123#!\n")',此行没有将密码插入脚本终端。
import gzip
import subprocess
with gzip.open('backup.gz', 'wb') as f:
popen = subprocess.Popen(['pg_dump', '--no-owner', '--no-acl', '-U', 'postgres', '-d', 'database_name', '-h', '178.111.11.111'], stdout=subprocess.PIPE, stdin=subprocess.PIPE, universal_newlines=True)
time.sleep(5)
popen.stdin.write("rootVidhyaDhan123#!\n") # code not working
for stdout_line in iter(popen.stdout.readline, ""):
f.write(stdout_line.encode('utf-8'))
popen.stdin.close()
popen.stdout.close()
popen.wait()
【问题讨论】:
-
您可能需要在这里使用 Pexpect:pexpect.readthedocs.io/en/stable。 Popen 只是立即将密码转储到标准输入中,而无需等待提示出现。
-
@shadowtalker 好的...这就是为什么我放了一个 sleep(10 在那里)。
-
也许 pg_dump 正在尝试从
/dev/tty而不是 stdn 读取密码。您可能需要为 pg_dump 指定一个命令行标志来更改此行为。
标签: python python-3.x postgresql subprocess stdin