【问题标题】:Python: Print Lines without Input Being broken upPython:在没有输入的情况下打印行被分解
【发布时间】:2015-08-24 02:53:55
【问题描述】:

我正在尝试为我正在运行的一个小型 AngularJS 应用程序创建一个简单的多线程命令提示符。

在这个提示符下,我想输入一个命令而不被输出分解,如下所示:

Output
More output HTTP 1.0
HTTP Request from 127.0.0.1 for /img/foo.png - 200
> Humble command I'm ty-OH NO BUT MORE OUTPUT
SUCH ANNOYING OUTPUT FOR FAVICON.ICO - 404
-ping.. Dang it.

相反,我想要这样:

Output
More output HTTP 1.0
HTTP Request from 127.0.0.1 for /img/foo.png - 200
OH NO BUT MORE OUTput and it's not breaking up what
you're typing... :/ - favicon.ico 404 btw...
> Humble command I'm typing that's not broken up

我不确定是否可以在命令提示符下使用,如果需要,我可能会导入 pygame 或查看 pyglet(如果需要),但我相信命令提示符更适合我的目的。

我希望我已经为您解释了,但如果您需要更多信息,请在下面提问!

使用 Python 3.x

Gist

这就是它的样子

编辑:我添加了 cmd.Cmd 作为我的命令提示符,并按照 J. F. Sebastian 告诉我的去做,但它的行为......奇怪......

【问题讨论】:

    标签: python python-3.x command-line-interface


    【解决方案1】:

    听起来您想将 python 脚本作为后台进程运行:

    >python yourScript.py &
    >now it won't interrupt you but you'll have to pipe output to a file if you want to read it
    

    & 是做什么用的。

    如果你想在后台运行脚本而不输出输出在 Python 中,我会考虑使用threading

    【讨论】:

    • 虽然这并不能解决我想要解决的问题,但 +1 获取信息!以后可能会用到!
    【解决方案2】:

    为避免来自其他线程的输出中断您的输入,请组织您的脚本以仅在主线程中执行标准 I/O,例如,将 sys.stdoutsys.stderr 替换为队列写入并在以下情况下使用队列的类文件对象你已经完成了输入:

    import sys
    from queue import Queue, Empty
    
    class QueuedFile:
       def __init__(self, queue):
           self.queue = queue
       def write(self, text):
           self.queue.put(text)
       def flush(self):
           pass # noop
    
    q = Queue()
    sys.stdout = sys.stderr = QueuedFile(q)
    
    # print from multiple threads while accepting input...
    
    # print queued output
    while True:
        try:
            sys.__stdout__.write(q.get(block=False))
        except Empty:
            break # no more output
    

    【讨论】:

    • 有趣...是否有一个模块,或者我需要制作它吗?
    • 我现在头晕目眩,但你帮了大忙!我去研究一下队列模块……
    • 我一直在查找它,当您可以将 block arg 保留为 True 时,为什么您有一个 try/except 块?
    • @MathManiac:当可用的排队输出用尽时打破循环。我假设还有一个外部循环,即您在没有中断的情况下读取输入,然后打印输出,然后再次读取输入,等等。
    • 我遇到了一个问题:sys.__stdout__ 和 sys.__stderr__ 返回 None,但我只是通过查看 sys 文档并将 sys.stderr 恢复正常才弄清楚这一点。 编辑:我不知道为什么不正常,但我会在我的程序开始时将它恢复正常,看看它是否有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    • 2023-02-20
    • 2021-12-22
    • 2017-11-08
    相关资源
    最近更新 更多