10

我正在尝试将函数的结果写入标准输入。

这是代码:

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

4 回答 4

23

你可以模拟stdin一个类似文件的对象吗?

import sys
import StringIO

oldstdin = sys.stdin
sys.stdin = StringIO.StringIO('asdlkj')

print raw_input('.')       #  .asdlkj
于 2013-02-24T19:27:08.110 回答
2

我自己在谷歌上搜索如何做到这一点并弄清楚了。对于我的情况,我从hackerrank.com 获取一些示例输入并将其放入一个文件中,然后希望能够将所述文件用作我的stdin,以便我可以编写一个可以轻松复制/粘贴到他们的IDE 中的解决方案。我使我的 2 个 python 文件可执行,添加了 shebang。第一个读取我的文件并写入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

于 2018-08-06T19:11:35.690 回答
1

在 Linux 上是可能的:

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()

于 2021-12-09T07:00:01.287 回答
0

stdin是输入流,而不是输出流。你不能给它写信。

您可能可以做的是使用创建管道os.pipe,使用将可读端转换为文件对象os.fdopen,并用它替换标准输入,然后写入可写端。

r, w = os.pipe()
new_stdin = os.fdopen(r, 'r')
old_stdin, sys.stdin = sys.stdin, new_stdin

不过,我看不出那个结局很好。重写应用程序中使用input.

于 2013-02-24T19:25:50.387 回答