Записать результат функции в стандартный ввод
Я пытаюсь записать результаты функции в стандартный ввод.
Это код:
def testy():
return 'Testy !'
import sys
sys.stdin.write(testy())
И ошибка, которую я получаю:
Traceback (most recent call last):
File "stdin_test2.py", line 7, in <module>
sys.stdin.write(testy())
io.UnsupportedOperation: not writable
Я не совсем уверен, это правильный способ делать вещи?
4 ответа
Вы могли бы издеваться stdin
с файловым объектом?
import sys
import StringIO
oldstdin = sys.stdin
sys.stdin = StringIO.StringIO('asdlkj')
print raw_input('.') # .asdlkj
Я гуглил, как сделать это сам и понял это. Для моей ситуации я взял пример ввода с hackerrank.com и поместил его в файл, а затем хотел иметь возможность использовать этот файл в качестве моего STDIN, чтобы я мог написать решение, которое можно было бы легко скопировать / вставить в их IDE, Я сделал свои 2 файла Python исполняемыми, добавил Шебанг. Первый читает мой файл и пишет в STDOUT.
#!/Users/ryandines/.local/share/virtualenvs/PythonPractice-U9gvG0nO/bin/python
# my_input.py
import sys
def read_input():
lines = [line.rstrip('\n') for line in open('/Users/ryandines/Projects/PythonPractice/swfdump')]
for my_line in lines:
sys.stdout.write(my_line)
sys.stdout.write("\n")
read_input()
Второй файл - это код, который я пишу для решения задачи программирования. Это было мое
#!/Users/ryandines/.local/share/virtualenvs/PythonPractice-U9gvG0nO/bin/python
def zip_stuff():
n, x = map(int, input().split(' '))
sheet = []
for _ in range(x):
sheet.append( map(float, input().split(' ')) )
for i in zip(*sheet):
print( sum(i)/len(i) )
zip_stuff()
Затем я использую команду канала операционной системы для обеспечения буферизации STDIN. Работает точно так же, как hackerrank.com, поэтому я могу легко вырезать / вставить образец ввода, а также соответствующий код, ничего не меняя. Назовите это так: ./my_input.py | ./zip_stuff.py
В линуксе можно:
import fcntl, termios
import os
tty_path = '/proc/{}/fd/0'.format(os.getpid())
with open(tty_path, 'w') as tty_fd:
for b in 'Testy !\n':
fcntl.ioctl(tty_fd, termios.TIOCSTI,b)
# input()
stdin
это входной поток, а не выходной поток. Вы не можете написать ему.
Возможно, вы сможете создать канал, используя os.pipe
превратить читаемый конец в объект файла, используя os.fdopen
и замените на него стандартный ввод, а затем запишите в конец записи.
r, w = os.pipe()
new_stdin = os.fdopen(r, 'r')
old_stdin, sys.stdin = sys.stdin, new_stdin
Я не вижу, чтобы это хорошо заканчивалось. Будет проще и менее подвержено ошибкам просто переписать части вашего приложения, которые используют input
,