Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python子进程错误:使用stdin将输入传递到终端_Python_Python 3.x_Postgresql_Subprocess_Stdin - Fatal编程技术网

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

Python子进程错误:使用stdin将输入传递到终端,python,python-3.x,postgresql,subprocess,stdin,Python,Python 3.x,Postgresql,Subprocess,Stdin,我正在尝试为PostgreSQL DB创建一个自动pg转储备份脚本。脚本要求输入数据库密码。我正在尝试使用stdin输入密码。但是,它不起作用popen.stdin.write(“rootpasswordhere123#!\n”),此行不会将密码插入脚本终端 import gzip import subprocess with gzip.open('backup.gz', 'wb') as f: popen = subprocess.Popen(['pg_dump', '--no-ow

我正在尝试为PostgreSQL DB创建一个自动pg转储备份脚本。脚本要求输入数据库密码。我正在尝试使用stdin输入密码。但是,它不起作用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()

可能pg_dump正在尝试从
/dev/tty
而不是stdin读取密码


设置
PGPASSWORD
环境变量(
os.environ['PGPASSWORD']='…'
)或创建
.pgpass
文件,而不是使用stdin。此处的详细信息:

您可能需要在此处使用Pexpect:。Popen只是立即将密码转储到stdin中,而没有等待提示出现。@shadowtalker Ok…这就是为什么我在其中放置了一个睡眠(10)。可能pg_dump是试图从
/dev/tty
而不是stdn读取密码。您可能需要为pg_dump指定一个命令行标志来更改此行为。@JintoAntony:不是使用pg_dump,而是使用其他Unix命令行工具。更好的方法是使用Popen的
env=
参数,如下所示: