Postgres Dump在eclipse中被攻击,使用的语言是python

时间:2014-01-02 12:18:06

标签: python postgresql

请参考下面的python代码,让我知道错误或需要做些什么才能使其正常工作。

我遇到的问题是,Eclipse被攻击并且备份文件为空。

import os
import subprocess

if __name__ == '__main__':
    print "test hello"

    localhost = 'localhost'
    port = '5432'
    role = 'serverdb_user'
    dump_dir = '/home/backupfile/'
    db_username = 'empserverdb_user'
    db_names = 'emp1'

    try:
        bkp_file = 'backup1'
        file_path = os.path.join(dump_dir, bkp_file)
        print file_path
        dumper_cmd = ['pg_dump', '-h', localhost, '-p', port, '-U', db_username, '--role', role, '-W', '-Fc', '-v', '-f', file_path, db_names]
        print dumper_cmd
        subprocess.check_output(dumper_cmd)
    except subprocess.CalledProcessError, ex:
        print("Couldn't back up database {0}: pg_dump returned {1} with output {2}".format(db_names, ex.returncode, ex.output))
    except Exception, ex:
        print("Couldn't backup database {0}: unexpected error {1}".format(db_names, ex))

...谢谢

1 个答案:

答案 0 :(得分:3)

首先,use proper exception handling。使用sys.exc_info来获取异常上下文,或者使用在本地获取异常的异常捕获,例如except Exception, ex:

此外,没有理由在这里使用shell=True,并且有很多理由不这样做。如果您在像Windows这样没有正确执行exec系统调用的平台上,请让subprocess模块处理shell转义。将一组参数传递给subprocess。这样做更容易,如果数据库名称,文件路径,用户名或其他内容中有空格,您的程序仍然可以正常工作。

最后,在较新的Python上使用subprocess.check_call,或者最好使用check_output。您未能查看通话结果,因此您无法确定是否出现了问题。 check_output将流程stderr存储在output的{​​{1}}字段中,方便报告错误。

否则,使用CalledProcessException并使用check_call模块的I / O重定向功能将subprocess输出写入文件。然后在错误中报告该文件名,以便用户可以查看它。

像(未经测试)的东西:

pg_dump