在 Win10 上从 Python 备份 Postgres

Backup Postgres from Python on Win10

我正在尝试在 Win10 上从 Python 备份 Postgres。

我正在使用 Anaconda python 3.8,本地装有 Postgres12 的 Win10 机器。在路径环境变量上,我有 postgres(lib 和 bin),没有 anaconda,和 python 3.8(没有 anaconda)。

我可以使用 window 的命令 shell:

正确备份数据库
pg_dump --dbname=postgresql://postgres:password@127.0.0.1:5432/test > C:\backup\dumpfile3.dump

但是当我 运行 它在 anaconda 上时:

os.system("pg_dump --dbname=postgresql://postgres:password@127.0.0.1:5432/test > C:\backup\dumpfile3.dump"  ) 

我得到输出 1 , 是错误代码。它创建了文件,但它是空的。

使用:

import subprocess
stk= 'pg_dump --dbname=postgresql://postgres:password@127.0.0.1:5432/test > C:\backup\dumpfile3.dump'

try:
    subprocess.check_output(stk, shell=True, stderr=subprocess.STDOUT)
except subprocess.CalledProcessError as e:
    raise RuntimeError("command '{}' return with error (code {}): {}".format(e.cmd, e.returncode, e.output))

我得到:

RuntimeError: command 'pg_dump --dbname=postgresql://postgres:password@127.0.0.1:5432/test > C:\backup\dumpfile3.dump' return with error (code 1): b"'pg_dump' is not recognized as an internal or external command,\r\noperable program or batch file.\r\n"

如果我使用:subprocess.runsubprocess.call 我不会产生错误,但创建的文件是空的。

似乎 anaconda 解释器上的 os.systemsubprocess 都无法访问命令 shell 上的环境变量。这怎么可能?我该如何克服它?是不同的用户调用 shell?

提前致谢。

重启电脑,问题解决了...。路径没有变化,我相信从安装东西 (python ,postgres, ...) 开始,机器还没有重新启动。

import os
os.system("pg_dump --dbname=postgresql://postgres:password@127.0.0.1:5432/test > C:\backup\dumpfile3.dump" )

成功了!并且

import subprocess
subprocess.call(r"C:\some\path\backup.bat")

也有效! backup.bat里面是:

pg_dump pg_dump --dbname=postgresql://postgres:password@127.0.0.1:5432/test > C:\backup\dumpfile3.dump

我想问题是 anaconda 解释器需要重新启动系统才能访问环境变量(postgres 变量所在的位置), 意义不大,因为 return with error (code 1): b"'pg_dump' is not recognized as an internal or external command,\r\noperable program or batch file.\r\n" 看到就像控制台消息。

如果有人有更好的解释,欢迎。