使用带有多个stdin的subprocess.popen来配置系统:Python 2.7

时间:2013-07-27 20:13:57

标签: python subprocess stdin popen

我的目标是使用python脚本配置我的新AWS实例,该脚本安装我的存储库和软件包,然后利用子进程配置(在本例中)postgres。值从yaml或json文件中读取。到目前为止,我已成功安装所有包和环境的回购。我遇到的是一个python脚本,它将在postgres中创建一个用户,然后创建一个数据库。

import subprocess
# out is to show output, com is the stdin value(s) to pass
def run(command, out=False, com=False, ):

  process = subprocess.Popen(
    command,
    close_fds=True,
    stdin=subprocess.PIPE,
    stdout=subprocess.PIPE,
    stderr=subprocess.STDOUT
  )

  if out:
    out = iter(process.stdout.readline, b'')
    for line in out:
      print(line)

  if com:
    process.stdin.write(com)
    # http://stackoverflow.com/questions/16091112/python-pipe-to-popen-stdin
    # process.communicate(com) doesn't fit, i need multiple stdin

run(['ls', '-l'], True) # works 
run(['sudo', 'su', '-', 'postgres']) # works 

run(['createuser'], False, 'testuser') 
# broken, also after i get this working, this should be a list of stdin values    
# this results in infinite lines:
# Shall the new role be a superuser? (y/n)
# I do have a workaround, run(['createuser', '-d', '-r', '-s', '-w', 'username'], False)
# Confirmed workaround created user successfully

1 个答案:

答案 0 :(得分:0)

我很久没有使用过Postgres,但我猜你想要postgres,然后运行一个需要postgres权利的命令。

但你的跑步(['sudo','su',' - ','postgres'])可能只是打开一个shell并等待;运行(['createuser'],False,'testuser')可能永远不会运行。

相反,我相信你应该结合这两个命令。请参阅su。

的“-c”选项

或者,更安全一点,你可以在sudo中为你的源用户提供postgres权限,从而使你的代码变得更加简单。