Klavye girişi nasıl okunur?


123

Python'da klavyeden veri okumak istiyorum

Bunu deniyorum:

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

Ama ne tutulma ne de terminalde işe yaramıyor, her zaman sorunun durağıdır. Bir sayı yazabilirim ama hiçbir şey olmadıktan sonra.

Neden biliyor musun?


12
Eminim ki OP bir sayı girdikten sonra Return tuşuna basmayı unutmuştur ve cevapların hiçbiri aslında soruyu cevaplamamaktadır.
Aran-Fey

Yanıtlar:


127

Deneyin

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

ve sayısal bir değere sahip olmak istiyorsanız, sadece dönüştürün:

try:
    mode=int(raw_input('Input:'))
except ValueError:
    print "Not a number"

2
Engellemesiz çok iş parçacıklı sürüm, klavye girişini engellemek yerine bir şeyler yapmaya devam edebilirsiniz: stackoverflow.com/a/53344690/4561887
Gabriel Staples

84

Görünüşe göre burada farklı Python'ları karıştırıyorsunuz (Python 2.x'e karşı Python 3.x) ... Bu temelde doğrudur:

nb = input('Choose a number: ')

Sorun, yalnızca Python 3'te desteklenmesidir. @Sharpner'ın yanıtladığı gibi, Python'un (2.x) eski sürümleri için işlevi kullanmanız gerekir raw_input:

nb = raw_input('Choose a number: ')

Bunu bir sayıya dönüştürmek istiyorsanız, denemelisiniz:

number = int(nb)

... bunun bir istisna oluşturabileceğini hesaba katmanız gerekse de:

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

Numarayı biçimlendirmeyi kullanarak yazdırmak istiyorsanız, Python 3'te str.format()önerilir:

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

Onun yerine:

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

Ancak her iki seçenek ( str.format()ve %) hem Python 2.7 hem de Python 3'te çalışır.


1
spaceKullanıcının barış durumunda girdisini girmesi için her zaman dizenizin arkasına bir koyun . Enter Tel12340404vs Enter Tel: 12340404. görmek! : P
Mehrad

Bitti. Önerin için teşekkürler.
Baltasarq

15

Engellemeyen, çok iş parçacıklı örnek:

(Beri klavye girişi engelleme gibi input()sık olduğu işlev blokları) değil bizim yapmak istediğimiz (reklamlarımızın sıkça gibi diğer şeyler yapıyor tutmak için), burada bir çok-sadeleştirilmiş çok dişli örnek göstermek için çalışmasını sağlamak için nasıl senin Ana uygulama, her geldiğinde klavye girişlerini okurken hala .

Bu, arka planda çalışacak bir iş parçacığı oluşturarak, sürekli olarak çağırarak input()ve aldığı tüm verileri bir kuyruğa geçirerek çalışır.

Bu şekilde, ana iş parçacığınız istediği her şeyi yapmak için bırakılır, kuyrukta bir şey olduğunda ilk iş parçacığından klavye giriş verilerini alır.

1. Çıplak Python 3 kod örneği (yorum yok):

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. Yukarıdaki ile aynı Python 3 kodu, ancak kapsamlı açıklayıcı yorumlarla:

"""
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()

Örnek çıktı:

$ python3 read_keyboard_input.py
Klavye girişi için hazır:
hey
input_str = hey
merhaba
input_str = merhaba
7000
input_str = 7000
çıkış
input_str = çıkış
Seri terminalden çıkılıyor.
Son.

Referanslar:

  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: Bir üst sınıftan nasıl alt sınıf oluşturabilirim?
  5. https://docs.python.org/3/library/queue.html
  6. https://docs.python.org/3.7/library/threading.html

İlgili / Çapraz Bağlı:

  1. PySerial engellemesiz okuma döngüsü

4

input([prompt])eşdeğerdir eval(raw_input(prompt))ve python 2.6'dan beri mevcuttur

Güvenli olmadığından (eval nedeniyle), raw_input kritik uygulamalar için tercih edilmelidir.


1
Bu ilginç bilgi için +1, ancak bunu işaret etmeme rağmen, gerçekten soruya bir yorum veya bir cevap olarak listelenmek çünkü gerçekten kendi başına bir cevap değil.
ArtOfWarfare

3
Ayrıca yalnızca Python 2.x için de geçerlidir. Python 3.x'te. raw_inputolarak yeniden adlandırılmıştır inputve DEĞERLENDİRMEZ.
Jason S

1
Bu soruya cevap vermiyor. Bir yazarı eleştirmek veya açıklama istemek için yazının altına bir yorum bırakın.
Eric Stein

@EricStein - Bayrağım reddedildi ve biraz düşünmeden sonra, çok aceleyle işaretlediğimi kabul ediyorum. Şuna
ArtOfWarfare

4

Bu çalışmalı

yourvar = input('Choose a number: ')
print('you entered: ' + yourvar)

7
Bu, öne sürülen diğer yanıtlardan ne kadar farklı input()?
David Makogon
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.