2013-07-27 2 views
0

Моя цель - настроить мои новые экземпляры AWS с помощью скрипта python, который устанавливает мои репозитории и пакеты, а затем использует подпроцесс для настройки (в данном случае) postgres. Значения считываются из файла yaml или json. До сих пор я успел установить все пакеты и репозитории для среды. Где я застрял - это скрипт python, который создаст пользователя в postgres, а затем создаст базу данных.Использование subprocess.popen с несколькими stdin для настройки системы: Python 2.7

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 

ответ

0

Я не использовал Postgres в возрасте, но я предполагаю, что вы хотите, чтобы су Postgres, а затем выполнить команду, требующую прав Postgres.

Но ваш запуск (['sudo', 'su', '-', 'postgres']), вероятно, просто откроет оболочку и будет ждать; run (['createuser'], False, 'testuser'), скорее всего, не будет запущен.

Вместо этого, я считаю, вы должны объединить эти две команды. См. Параметр «-c» для su.

В качестве альтернативы, и немного более надежно, вы могли бы предоставить своим пользователям права доступа postgres в sudo, вырваться из уравнения и сделать ваш код немного проще.

+0

он бежит. См. Бесконечный вывод: будет ли новая роль суперпользователем? (y/n) –

+0

Таким образом, лучший способ решить это - не запускать команды с подпроцессом, для которых требуется несколько stdin. У меня такое чувство, что это работает на Python 3. –

+0

Выполнено из этого: https://github.com/muhuk/cuisine-postgresql/blob/master/cuisine_postgresql.py –

Смежные вопросы