【问题标题】:Non-blocking raw_input with line editing using gevent使用 gevent 进行行编辑的非阻塞 raw_input
【发布时间】:2013-07-03 17:09:23
【问题描述】:

我正在尝试通过使用 gevent 的内部 API 实现交互式外壳。我希望后台 greenlets 在等待用户输入的同时继续运行,并且我还希望 readline 命令行功能(历史记录、行编辑等)

我的问题似乎是 raw_input 阻塞了。有一些解决方案可以将 raw_input 替换为以下内容:

def raw_input(prompt):
  sys.stdout.write(prompt)
  sys.stdout.flush()

  select.select([sys.stdin], [], [])
  return sys.stdin.readline().rstrip('\n')

这解决了阻塞问题;背景greenlets现在运行良好。但是我失去了交互式行编辑功能。

有什么建议或解决方法吗?

【问题讨论】:

  • 我没有一个可靠的答案,但希望能找到一个正确的方向:您尝试过cmd 模块吗?或者,您是否尝试将readline 模块合并到您对raw_input() 的重新定义中?我对后一种情况并不乐观,因为与实际的 C 库相比,readline 模块感觉相当残废,但值得一试。
  • 嗯,cmd 看起来很有希望,但默认情况下它使用 raw_input,所以它会阻塞。你可以将use_rawinput设置为false,但它不仅仍然阻塞,而且你也失去了行编辑!

标签: python python-2.7 io gevent


【解决方案1】:

您可以尝试在单独的线程中使用 raw_input,然后将结果返回到全局变量。不确定这是否对你有用,它对我有用,但在完全不同的情况下

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-18
    • 2012-11-28
    • 2020-01-16
    • 2011-02-19
    • 1970-01-01
    相关资源
    最近更新 更多