不能用subprocess.call做“sudo su - postgres”

时间:2015-06-04 17:06:11

标签: python

我尝试以下命令:

subprocess.call(['sudo', 'su - postgres'], shell=True)

subprocess.call(['sudo', 'su', '-', 'postgres'], shell=True)
Python2.7中的

(通过ipython手动编写行,或python myfile.py作为代码的一部分行),并获取sudo用法信息:

usage: sudo [-D level] -h | -K | -k | -V
usage: sudo -v [-AknS] [-D level] [-g groupname|#gid] [-p prompt] [-u user
        name|#uid]
usage: sudo -l[l] [-AknS] [-D level] [-g groupname|#gid] [-p prompt] [-U user
        name] [-u user name|#uid] [-g groupname|#gid] [command]
usage: sudo [-AbEHknPS] [-C fd] [-D level] [-g groupname|#gid] [-p prompt] [-u
        user name|#uid] [-g groupname|#gid] [VAR=value] [-i|-s] [<command>]
usage: sudo -e [-AknS] [-C fd] [-D level] [-g groupname|#gid] [-p prompt] [-u
        user name|#uid] file ...

我可以在shell中运行命令,完全没有问题。两次都是相同的shell。

:我做错了什么?

1 个答案:

答案 0 :(得分:4)

来自subprocess docs

  

所有调用都需要args,它应该是一个字符串或一系列程序参数。通常优选提供一系列自变量,因为它允许模块处理任何所需的转义和引用参数(例如,允许文件名中的空格)。如果传递单个字符串,则shell必须为True(参见下文),否则字符串必须简单地命名要执行的程序而不指定任何参数。

因此,您的列表实际上是一个序列。对于单个命令,只需将字符串放在一起,因为不需要将其拆分:

subprocess.call(['sudo su - postgres'], shell=True)