【问题标题】:os.system with embedded commands带有嵌入式命令的 os.system
【发布时间】:2013-11-13 08:42:15
【问题描述】:

我现在已经苦苦挣扎了很长时间,仍然无法让这行代码工作:

os.system('su - postgres -c "psql -c \'ALTER USER postgres WITH ENCRYPTED PASSWORD \\\"{0}\\\";\'"'.format(self.password))

并记录结果:

2013-11-12 19:58:42 ICT ERROR:  syntax error at or near ""password"" at character 45
2013-11-12 19:58:42 ICT STATEMENT:  ALTER USER postgres WITH ENCRYPTED PASSWORD "password";

有什么想法吗?

【问题讨论】:

  • 将你的命令字符串放入一个变量中,然后打印出来以便检查。使用变量而不是直接在调用中编码使调试更容易。

标签: python postgresql operating-system


【解决方案1】:

呃。请尽可能使用psycopg2,这是 PostgreSQL 的原生 Python 客户端驱动程序。

如果您必须转至psql,请使用subprocess 模块的check_call 函数,因为它会为您处理报价,因此更简单、更安全。

import subprocess
subprocess.check_call([
    'psql', '-c',
    'ALTER USER postgres WITH ENCRYPTED PASSWORD "{0}";'.format(self.password)
])

os.system 真的应该是 IMO 的最后手段。

【讨论】:

  • 您好,感谢您的提示。我还不能使用 psycopg2,因为脚本应该在安装任何模块之前运行。我写了这个,但 check_call 似乎误解了命令,因为 psql shell 在执行后仍然打开: check_call(['sudo', '-u', postgres', 'sh', '-c', 'psql', '-- quiet', '-c', 'ALTER USER postgres WITH ENCRYPTED PASSWORD "{0}";'.format(self.pgsql_pwd)]) ?并且文档指定不使用 PIPE 语句,那么我该如何解决呢?
  • @JohnDoe 我不小心在我的示例中省略了-c。固定的。如果你想要 sudo,不要用 sh -c 包装命令。 check_call(['sudo', '-u', 'postgres', 'psql', '--quiet', '-c', '...sql...'])。如果你使用sh -c,那么你就会回到同样的论点,引用你已经陷入的混乱。
  • 很好用!但正如@Jayadevan 建议的那样,我也必须用转义的单引号 (\') 替换双引号。谢谢大家 ! ;)
【解决方案2】:

密码应该用单引号 -

postgres=# create user usr with password "password";
ERROR:  syntax error at or near ""password""
LINE 1: create user usr with password "password";
                                      ^
postgres=# create user usr with password 'password';
CREATE ROLE

【讨论】:

    猜你喜欢
    • 2019-05-10
    • 2012-07-16
    • 2013-09-01
    • 2018-01-02
    • 2018-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-16
    相关资源
    最近更新 更多