我尝试以下命令:
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。
问:我做错了什么?
答案 0 :(得分:4)
所有调用都需要args,它应该是一个字符串或一系列程序参数。通常优选提供一系列自变量,因为它允许模块处理任何所需的转义和引用参数(例如,允许文件名中的空格)。如果传递单个字符串,则shell必须为True(参见下文),否则字符串必须简单地命名要执行的程序而不指定任何参数。
因此,您的列表实际上是一个序列。对于单个命令,只需将字符串放在一起,因为不需要将其拆分:
subprocess.call(['sudo su - postgres'], shell=True)