Чтение ввода от пользователя и сохранение его в переменной с помощью подпроцесса - PullRequest
0 голосов
/ 17 января 2019

Я пытаюсь прочитать ввод от пользователя и сохранить его в переменной, используя subprocess.check_output в python2.7. Но он показывает ошибку OSError: [Errno 2] No such file or directory, когда я пытаюсь его запустить. Также следует отметить, что я строго хочу использовать shell=False из-за проблем безопасности.

Я пробовал subprocess.Popen, и это тоже не работает. Я пытался использовать sys.stdin = open('/dev/tty', 'r') и stdin=subprocess.PIPE, но выдает ту же ошибку, что и выше.

>>> import sys
>>> import subprocess
>>> sys.stdin = open('/dev/tty', 'r')
>>> cmd = ('read userinput && echo "$userinput"')
>>> confirmation = subprocess.check_output(cmd.split(), stdin=sys.stdin).rstrip()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/subprocess.py", line 567, in check_output
    process = Popen(stdout=PIPE, *popenargs, **kwargs)
  File "/usr/lib/python2.7/subprocess.py", line 711, in __init__
    errread, errwrite)
  File "/usr/lib/python2.7/subprocess.py", line 1343, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

Ожидаемый результат заключается в том, что он должен запросить ввод данных пользователем и сохранить его в переменной confirmation

1 Ответ

0 голосов
/ 17 января 2019

Вы вводите команду оболочки (read и echo - встроенные функции оболочки, а && - синтаксис оболочки), поэтому вам необходимо shell=True. Это одна команда оболочки, поэтому вы не используете split. Скобки вокруг команды в python в этом случае не действуют:

import sys
import subprocess
sys.stdin = open('/dev/tty', 'r')

cmd = 'read userinput && echo "$userinput"'
confirmation = subprocess.check_output(cmd, stdin=sys.stdin, shell=True).rstrip()

print'****', confirmation

Дает:

$ python gash.py
hello
**** hello
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...