在 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.run
或 subprocess.call
我不会产生错误,但创建的文件是空的。
似乎 anaconda 解释器上的 os.system
或 subprocess
都无法访问命令 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"
看到就像控制台消息。
如果有人有更好的解释,欢迎。
我正在尝试在 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.run
或 subprocess.call
我不会产生错误,但创建的文件是空的。
似乎 anaconda 解释器上的 os.system
或 subprocess
都无法访问命令 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"
看到就像控制台消息。
如果有人有更好的解释,欢迎。