Como ler a entrada do teclado?

123

Eu gostaria de ler dados do teclado em python

Eu tento isso:

nb = input('Choose a number')
print ('Number%s \n' % (nb))

Mas não funciona, nem com eclipse nem no terminal, é sempre o ponto final da questão. Eu posso digitar um número, mas depois que nada acontece.

Você sabe por quê?

tranen
fonte
12
Tenho certeza de que o OP esqueceu de pressionar Retornar depois de digitar um número e nenhuma das respostas realmente responde à pergunta.
Aran-Fey

Respostas:

127

experimentar

raw_input('Enter your input:')  # If you use Python 2
input('Enter your input:')      # If you use Python 3

e se você quiser ter um valor numérico, apenas converta-o:

try:
    mode=int(raw_input('Input:'))
except ValueError:
    print "Not a number"
afiado
fonte
2
Sem bloqueio versão multi-threaded, para que possa continuar a fazer coisas em vez de bloquear a entrada do teclado: stackoverflow.com/a/53344690/4561887
Gabriel Staples
84

Parece que você está misturando Pythons diferentes aqui (Python 2.x vs. Python 3.x) ... Isso é basicamente correto:

nb = input('Choose a number: ')

O problema é que ele é suportado apenas no Python 3. Como o @sharpner respondeu, para versões mais antigas do Python (2.x), você deve usar a função raw_input:

nb = raw_input('Choose a number: ')

Se você deseja converter isso em um número, tente:

number = int(nb)

... embora você precise levar em consideração que isso pode gerar uma exceção:

try:
    number = int(nb)
except ValueError:
    print("Invalid number")

E se você deseja imprimir o número usando a formatação, str.format()recomenda-se no Python 3 :

print("Number: {0}\n".format(number))

Ao invés de:

print('Number %s \n' % (nb))

Mas ambas as opções ( str.format()e %) funcionam no Python 2.7 e no Python 3.

Baltasarq
fonte
1
sempre coloque uma spacesequência depois da string para que o usuário insira sua entrada se houver paz. Enter Tel12340404vs Enter Tel: 12340404. Vejo! : P
Mehrad
Feito. Obrigado pela sugestão.
Baltasarq
15

Exemplo multi-thread sem bloqueio:

Como bloquear a entrada do teclado (já que os input()blocos de funções) freqüentemente não é o que queremos fazer (gostaríamos de continuar fazendo outras coisas), aqui está um exemplo multithread muito simplificado para demonstrar como continuar executando seu aplicativo principal enquanto ainda lê as entradas do teclado sempre que chegam .

Isso funciona criando um encadeamento para execução em segundo plano, chamando continuamente input()e passando os dados que recebe para uma fila.

Dessa maneira, seu segmento principal fica para fazer o que quiser, recebendo os dados de entrada do teclado do primeiro segmento sempre que houver algo na fila.

1. Exemplo de código Bare Python 3 (sem comentários):

import threading
import queue
import time

def read_kbd_input(inputQueue):
    print('Ready for keyboard input:')
    while (True):
        input_str = input()
        inputQueue.put(input_str)

def main():
    EXIT_COMMAND = "exit"
    inputQueue = queue.Queue()

    inputThread = threading.Thread(target=read_kbd_input, args=(inputQueue,), daemon=True)
    inputThread.start()

    while (True):
        if (inputQueue.qsize() > 0):
            input_str = inputQueue.get()
            print("input_str = {}".format(input_str))

            if (input_str == EXIT_COMMAND):
                print("Exiting serial terminal.")
                break

            # Insert your code here to do whatever you want with the input_str.

        # The rest of your program goes here.

        time.sleep(0.01) 
    print("End.")

if (__name__ == '__main__'): 
    main()

2. O mesmo código Python 3 como acima, mas com extensos comentários explicativos:

"""
read_keyboard_input.py

Gabriel Staples
www.ElectricRCAircraftGuy.com
14 Nov. 2018

References:
- https://pyserial.readthedocs.io/en/latest/pyserial_api.html
- *****https://www.tutorialspoint.com/python/python_multithreading.htm
- *****https://en.wikibooks.org/wiki/Python_Programming/Threading
- /programming/1607612/python-how-do-i-make-a-subclass-from-a-superclass
- https://docs.python.org/3/library/queue.html
- https://docs.python.org/3.7/library/threading.html

To install PySerial: `sudo python3 -m pip install pyserial`

To run this program: `python3 this_filename.py`

"""

import threading
import queue
import time

def read_kbd_input(inputQueue):
    print('Ready for keyboard input:')
    while (True):
        # Receive keyboard input from user.
        input_str = input()

        # Enqueue this input string.
        # Note: Lock not required here since we are only calling a single Queue method, not a sequence of them 
        # which would otherwise need to be treated as one atomic operation.
        inputQueue.put(input_str)

def main():

    EXIT_COMMAND = "exit" # Command to exit this program

    # The following threading lock is required only if you need to enforce atomic access to a chunk of multiple queue
    # method calls in a row.  Use this if you have such a need, as follows:
    # 1. Pass queueLock as an input parameter to whichever function requires it.
    # 2. Call queueLock.acquire() to obtain the lock.
    # 3. Do your series of queue calls which need to be treated as one big atomic operation, such as calling
    # inputQueue.qsize(), followed by inputQueue.put(), for example.
    # 4. Call queueLock.release() to release the lock.
    # queueLock = threading.Lock() 

    #Keyboard input queue to pass data from the thread reading the keyboard inputs to the main thread.
    inputQueue = queue.Queue()

    # Create & start a thread to read keyboard inputs.
    # Set daemon to True to auto-kill this thread when all other non-daemonic threads are exited. This is desired since
    # this thread has no cleanup to do, which would otherwise require a more graceful approach to clean up then exit.
    inputThread = threading.Thread(target=read_kbd_input, args=(inputQueue,), daemon=True)
    inputThread.start()

    # Main loop
    while (True):

        # Read keyboard inputs
        # Note: if this queue were being read in multiple places we would need to use the queueLock above to ensure
        # multi-method-call atomic access. Since this is the only place we are removing from the queue, however, in this
        # example program, no locks are required.
        if (inputQueue.qsize() > 0):
            input_str = inputQueue.get()
            print("input_str = {}".format(input_str))

            if (input_str == EXIT_COMMAND):
                print("Exiting serial terminal.")
                break # exit the while loop

            # Insert your code here to do whatever you want with the input_str.

        # The rest of your program goes here.

        # Sleep for a short time to prevent this thread from sucking up all of your CPU resources on your PC.
        time.sleep(0.01) 

    print("End.")

# If you run this Python file directly (ex: via `python3 this_filename.py`), do the following:
if (__name__ == '__main__'): 
    main()

Saída de amostra:

$ python3 read_keyboard_input.py
Pronto para entrada do teclado:
ei
input_str = ei
olá
input_str = olá
7000
input_str = 7000
exit
input_str = exit
Sair do terminal serial.
Fim.

Referências:

  1. https://pyserial.readthedocs.io/en/latest/pyserial_api.html
  2. ***** https://www.tutorialspoint.com/python/python_multithreading.htm
  3. ***** https://en.wikibooks.org/wiki/Python_Programming/Threading
  4. Python: Como faço para criar uma subclasse de uma superclasse?
  5. https://docs.python.org/3/library/queue.html
  6. https://docs.python.org/3.7/library/threading.html

Relacionado / com ligação cruzada:

  1. Loop de leitura PySerial sem bloqueio
Gabriel Staples
fonte
4

input([prompt])é equivalente eval(raw_input(prompt))e está disponível desde o python 2.6

Como não é seguro (por causa da avaliação), raw_input deve ser preferido para aplicativos críticos.

jeanM
fonte
1
+1 para esse detalhe interessante de informações, embora eu esteja sinalizando isso porque realmente deve ser listado como um comentário sobre a pergunta ou uma resposta, porque não é realmente uma resposta por si só.
ArtOfWarfare
3
Também é aplicável apenas ao Python 2.x. No Python 3.x. raw_inputfoi renomeado para inpute NÃO avalia.
Jason S
1
Isso não fornece uma resposta para a pergunta. Para criticar ou solicitar esclarecimentos a um autor, deixe um comentário abaixo da postagem.
Eric Stein
@ EricStein - Minha bandeira foi recusada e, após algumas reflexões, concordo que a sinalizei muito apressadamente. Veja isto: meta.stackexchange.com/questions/225370/…
ArtOfWarfare
4

Isso deve funcionar

yourvar = input('Choose a number: ')
print('you entered: ' + yourvar)
Antoine
fonte
7
Como isso é diferente das outras respostas sugeridas input()?
David Makogon