【发布时间】:2020-11-27 15:47:11
【问题描述】:
我正在尝试在 Win10 上从 Python 备份 Postgres。
我正在使用本地 Postgres12 的 Anaconda python 3.8、Win10 机器。在路径环境变量中,我有 postgres(lib 和 bin)、没有 anaconda 和 python 3.8(没有 anaconda)。
我能够使用窗口的命令外壳正确备份数据库:
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.run 或 subprocess.call 我不会产生错误,但创建的文件是空的。
anaconda 解释器上的 os.system 或 subprocess 似乎都无法访问命令 shell 上的环境变量。这怎么可能?以及如何克服它?调用shell的是不同的用户吗?
提前致谢。
【问题讨论】:
标签: python postgresql shell backup os.system