2014-12-18 2 views
0

Привет, у меня есть такая проблема. Мне нужно войти в систему через подпроцесс. Поэтому я хочу, чтобы создать входную трубу и писать логин и пароль для доступа them.So я пытаюсь сделать что-то вроде этого:Python subprocess stdin pipe

sp = subprocess.Popen([cmd],stdout=subprocess.PIPE, stdin=subprocess.PIPE) 
i, o = sp.communicate() 

После первой строки я иметь такую ​​ошибку tcgetattr: Inappropriate ioctl for device. И у меня нет значения o. Как я могу написать smth в трубу в этом случае. Спасибо за помощь.

+0

Вы не предоставляете ничего для 'stderr':' stderr = subprocess.PIPE' –

ответ

0

От subprocess.communicate(input) docs:

Дополнительный входной аргумент должен быть данные для отправки ребенка процесс ...
Обратите внимание, что если вы хотите отправить данные в стандартный ввод текущего процесса, вам нужно создать объект Popen с помощью stdin = PIPE. Аналогично, чтобы получить что-либо , отличное от None в кортеже результата, вам необходимо указать stdout = PIPE и/или stderr = PIPE.

т. Е. Для ввода ввода в подпроцесс указать параметр input; для получения значения: Noneo, вы должны указать stderr=PIPE.

Во многих случаях пароль и пароль сами не записываются в/чтение из канала, а напрямую в/из терминала, т. Е. Вам может потребоваться псевдо-tty для передачи пароля, если только команда не позволяет установить параметр для принятия пароль через stdin. Вы можете использовать pexpect для взаимодействия с дочерним процессом с использованием pty. См. Первую причину в Why not just use a pipe (popen())?