【问题标题】:Write function result to stdin将函数结果写入标准输入
【发布时间】:2013-02-09 22:06:20
【问题描述】:

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

这是代码:

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

我不完全确定,这是正确的做事方式吗?

【问题讨论】:

  • 你想要做什么? stdin 用于读取输入,它以只读方式打开。
  • 是的,我知道。我想要做的是通过写入标准输入来模拟对 input() 方法的击键。
  • @Awake 了解一些上下文会有所帮助:为什么要模仿input() 中的击键?
  • 因为我有一个最初在 shell 中的程序,现在它使用的是 GUI。我想要做的是将点击事件转换为字符串(完成)并将结果传递给先前使用的 input() 方法。
  • 我以前会要求用户写 1、2 或 3 来选择选项,我知道 GUI 上有三个位置可供用户单击。然后将 event.x 和 event.y 转换为特殊字符串并通过管道传输到 input()。

标签: python python-3.x stdin


【解决方案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()

【讨论】:

    【解决方案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

    【讨论】:

    • 嘿,谢谢,这和我的用例完全一样 :) 就像一个魅力!
    • 嘿,瑞恩,做得很好。你知道你可以直接使用一个文件作为命令行的输入,这样你就不需要编写你的第一个程序了吗?还是我错过了什么?:./zip_stuff.py &lt; '/Users/ryandines/Projects/PythonPractice/swfdump'
    • @tharibo 是的,你是对的,或者只是 cat 文件cat swfdump | ./zip_stuff.py,虽然对于hackerrank,我需要一些特定的行为......我真的不记得TBH
    【解决方案3】:

    你可以用类似文件的对象模拟stdin

    import sys
    import StringIO
    
    oldstdin = sys.stdin
    sys.stdin = StringIO.StringIO('asdlkj')
    
    print raw_input('.')       #  .asdlkj
    

    【讨论】:

    • 我想我会试试这个解决方案。谢谢!
    • 对于 Python 3:from io import StringIOsys.stdin = StringIO('asdlkj')
    【解决方案4】:

    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-04-03
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 2012-08-24
    • 2022-01-24
    • 1970-01-01
    • 2011-07-23
    相关资源
    最近更新 更多