Python Как правильно использовать Pexpect?

#python #bash

#python #bash

Вопрос:

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

Вот команда для установки homebrew :

 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
  

Когда я ввожу эту команду, я сначала получаю это приглашение : Password:
Затем я получаю подсказку Press RETURN to continue or any other key to abort .

Я попытался написать скрипт с использованием pexpect для установки скриптов.

 import pexpect as px
import getpass

password = getpass.getpass() #Password as a string from the user
px.run('''/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"''') #Triple quotes because command contains double quotes
px.expect('Password:')
px.send(password)
px.expect('Press RETURN to continue or any other key to abort')
px.send('n')

  

Это правильный способ автоматизировать установку этого скрипта? Пожалуйста, дайте мне знать, если это нормально.

Большое спасибо, и я действительно ценю вашу помощь!

Комментарии:

1. во многих программах, которые получают данные из stdin (например, keyboard в консоли), вы можете создать файл со всеми ответами (в разделенных строках) и запустить program < all_answers.txt , но я не знаю, будет ли это работать с паролем, потому что он может использовать специальную функцию для скрытия пароля

2. Верен ли этот скрипт, который я написал? Я уже нашел способ скрыть пароль. Дайте мне знать, может ли этот скрипт работать

3. просто попробуйте ваш скрипт и посмотрите, работает ли он.

4. сначала запустите, и если вы получите сообщение об ошибке, то покажите его в вопросе. Не ожидайте, что мы запустим его — и он может корректно работать на наших компьютерах, но не работать на вашем компьютере.

5. смотрите документацию для run() — кажется, что она запускает код и ожидает его завершения, и вы не можете использовать ее с expect и send . Вам нужно было бы spawn() использовать expect и send . Или run(... events={"Password:": password, ...})