Python子进程错误:使用标准输入将输入传递到终端

Posted

技术标签:

【中文标题】Python子进程错误:使用标准输入将输入传递到终端【英文标题】:Python subprocess error : Pass input to terminal using stdin 【发布时间】: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 指定一个命令行标志来更改此行为。 【参考方案1】:

可能 pg_dump 正在尝试从 /dev/tty 而非标准输入读取密码。

设置PGPASSWORD 环境变量(os.environ['PGPASSWORD'] = '...') 或创建.pgpass 文件,而不是使用标准输入。详情在这里:How to pass in password to pg_dump?

【讨论】:

@JintoAntony:不是用 pg_dump,而是用其他 Unix 命令行工具。 更好的是,使用 Popen 的env= 参数,如下所示:***.com/a/4453495/2954547

以上是关于Python子进程错误:使用标准输入将输入传递到终端的主要内容,如果未能解决你的问题,请参考以下文章

Python子进程将数据定向到标准输入

确定子进程是不是从标准输入读取

如何写入 Python 子进程的标准输入?

使用文件作为子进程的标准输入和标准输出

使用 bash,我如何将标准错误传递到另一个进程?

Python:如何写入子进程的标准输入并实时读取其输出