【问题标题】:Read input from StdIn when redirecting StdIn to python manage.py shell将 StdIn 重定向到 python manage.py shell 时从 StdIn 读取输入
【发布时间】:2017-06-23 18:46:24
【问题描述】:

我有一个 python 脚本,我称之为重定向到 Django manage.py shell

$ python manage.py shell < script.py

我想从用户那里得到答案来决定做什么。但我不能用input()sys.stdin.readline() 做到这一点。

带输入()

answer = input('A question')
if answer == 'y':
    # Do something
else:
    pass

错误:

EOFError: EOF when reading a line

使用 sys.stdin.readline:

answer = sys.stdin.readline()
if answer == 'y':
    # Do something
else:
    pass

在这种情况下,脚本会继续执行,无需等待用户输入。

这样做的正确方法是什么?

【问题讨论】:

  • 为什么要将字符串“A question”传递给 readline()?
  • 抱歉,我已经更正了问题。
  • 你试过用 raw_input() 代替 input() 吗?
  • raw_input 在 Python 3 中重命名为 input
  • 我认为问题与尝试从stdin 获取输入有关,而此时已经处于stdin 流重定向中。因为这两个命令似乎都在考虑 stdin 下一个文件字符。

标签: python django shell stdin


【解决方案1】:

您正在让./manage.py shell 获得一些输入,但您提供的输入是script.py 的内容。

写一个自定义的Django management command 会好很多。例如:

from django.core.management.base import BaseCommand

class Command(BaseCommand):
    def handle(self, *args, **options):
        answer = input('A question')
        if answer == 'y':
            # Do something
        else:
            pass

然后您可以使用manage.py my_script 调用它。

【讨论】: