从用户读取输入并将其存储到使用子过程的变量中

时间:2019-01-17 09:23:32

标签: python bash python-2.7 subprocess

我正在尝试从用户读取输入并将其通过python2.7中的subprocess.check_output存储在变量中。但是当我尝试运行它时,它会显示错误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 :(得分:0)

您正在输入shell命令(readecho是shell内置的,而&&是shell语法),因此您需要shell=True。这是一个单一的shell命令,因此您无需使用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