Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中只接受数字作为输入_Python - Fatal编程技术网

在Python中只接受数字作为输入

在Python中只接受数字作为输入,python,Python,有没有办法在Python中只接受数字,比如使用raw\u input() 我知道我总是可以获得输入并捕获一个ValueError异常,但我想知道是否有某种方法可以强制提示只接受数字并冻结任何其他输入。据我所知,没有。我从来没有听说过终端可以实现这种情况,使用Python或任何其他语言 我能想到的最接近伪造它的方法是将终端置于静默模式(这样输入的字符就不会被回响)和无缓冲模式(这样你就可以在不等待行尾的情况下按输入的字符输入),然后逐个读取每个输入字符;如果它是一个数字,则打印它并将其附加到字符串

有没有办法在Python中只接受数字,比如使用
raw\u input()


我知道我总是可以获得输入并捕获一个
ValueError
异常,但我想知道是否有某种方法可以强制提示只接受数字并冻结任何其他输入。

据我所知,没有。我从来没有听说过终端可以实现这种情况,使用Python或任何其他语言

我能想到的最接近伪造它的方法是将终端置于静默模式(这样输入的字符就不会被回响)和无缓冲模式(这样你就可以在不等待行尾的情况下按输入的字符输入),然后逐个读取每个输入字符;如果它是一个数字,则打印它并将其附加到字符串中,否则丢弃它。但我甚至不确定终端是否允许您这样做。

来自:

如何一次按一个键?

对于Unix变体:有几个 解决。这很简单 这是使用诅咒,但诅咒是一个错误 要学习的模块相当大。这里有一个 没有诅咒的解决方案:

您需要termios和fcntl 任何一个模块的工作,以及 我只在Linux上试过,不过 应该在别处工作。在这部法典中, 一次读取和打印字符 一段时间

tcsetattr()关闭标准输入的 回显并禁用规范模式。 fcntl.fnctl()用于获取 stdin的文件描述符标志和 为非阻塞模式修改它们。 因为在stdin为空时读取它 导致IOError,此错误为 被抓住并被忽视


使用这个,你可以抓取字符,检查它是否是一个数字,然后显示它。不过,我自己还没有试过。

你为什么要这样做?我正在制作一个接受分数作为输入的小脚本。你可能可以编写自己的类来实现这一点,我认为没有任何内置功能。@Alfred:我也做过同样的事情,编写了一个评分脚本。只需在非数字输入时引发一个
ValueError
。@David:Aah!我认为Python中必须有一种方法。显然,我们的思路是一样的;-)+但是代码是1。我只是尝试了一下,做了一些小改动,它似乎完全符合我的要求。
import termios, fcntl, sys, os
fd = sys.stdin.fileno()

oldterm = termios.tcgetattr(fd)
newattr = termios.tcgetattr(fd)
newattr[3] = newattr[3] & ~termios.ICANON & ~termios.ECHO
termios.tcsetattr(fd, termios.TCSANOW, newattr)

oldflags = fcntl.fcntl(fd, fcntl.F_GETFL)
fcntl.fcntl(fd, fcntl.F_SETFL, oldflags | os.O_NONBLOCK)

try:
    while 1:
        try:
            c = sys.stdin.read(1)
            print "Got character", `c`
        except IOError: pass
finally:
    termios.tcsetattr(fd, termios.TCSAFLUSH, oldterm)
    fcntl.fcntl(fd, fcntl.F_SETFL, oldflags)