相关疑难解决方法(0)

原始模式下的Python stdin print增加了空格

我需要在Python中将标准输入切换到非缓冲模式,以便我可以读取它的单个字符.我设法让它工作,但现在标准输出被打破:不知何故,似乎在换行符后,发出一些空格字符,第一行为零,第二行为3,第三行为6,等等,这样:

ASD
   ASD
      ASD
Run Code Online (Sandbox Code Playgroud)

操作系统是Ubuntu Linux 12.04,64位版本,Python版本是3.2.3.

我怎样才能摆脱这种行为呢?

以下是我用过的代码:

import sys
import tty
import termios

fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
tty.setraw(sys.stdin)

for i in range(0, 10):
    print("ASD")

termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
Run Code Online (Sandbox Code Playgroud)

python linux stdin buffering

8
推荐指数
3
解决办法
2808
查看次数

适用于 Mac 和 Windows 的 python 3 中的定时输入

我需要在 Mac 和 Windows 上为 python 3 提供定时输入,如果用户没有时间,它会自动选择其中一个选项。我见过的问题的所有其他答案只有在用户按“Enter”键后才会终止。无论是否按下“Enter”键,我都需要它终止。

例如,在我的国际象棋程序中,如果5秒后没有输入,我需要它自动选择“Q”。另外,如果输入不在 [“Q”,“R”,“B”,“N”] 中,那么我还需要它来选择“Q”。

下面的代码不起作用。它会要求输入然后永远等待;计时器根本不工作。

def countdown():
    global timer
    timer = 5
    for x in range(timer):
        timer -= 1
        time.sleep(1)

countdownThread = threading.Thread(target=countdown)
countdownThread.start()

while timer > 0:
    promotedPiece = input("Promote to Q, R, B or N? >  ").upper()
    if timer == 0:
        break

if timer == 0:
    if promotedPiece not in ["Q", "R", "B", "N"]:  # If not valid input, choose Queen
        promotedPiece = "Q"
        print("Queen auto selected")
Run Code Online (Sandbox Code Playgroud)

python multithreading timer python-multithreading python-3.x

7
推荐指数
1
解决办法
605
查看次数

如何接受箭头键输入或接受方向输入?

这可能是一个xy问题,但我正在尝试构建一个基于内核的文本编辑器,类似于vim或者nano,我知道如何使用转义字符清除屏幕,然后重新打印,我可以让它接受字符,但是我不知道如何让它接受箭头输入导航.我认为它们有ASCII值,但显然不是.有没有办法使用箭头,还是我必须进行导航模式和插入模式vim

我也曾经简单地玩过curses,但这是令人望而却步的,因为据我所知,必须为它打开一个全新的窗口,这与我所拥有的单个终端窗口的视觉不兼容.

编辑:curses也是禁止,因为它清除了窗口,我不想要.

python text-editor

6
推荐指数
2
解决办法
1万
查看次数

python:在连续循环中使用键盘输入?

操作系统是 Redhat-c​​lone Linux 发行版,我使用的是 python-2.x。

一般代码结构为:

# stuff is initialized
while True:
    # read stuff from remote devices
    # process data
    # maybe do stuff, or maybe just watch
    os.system("clear")
    # display status of remote devices
    time.sleep(1)
Run Code Online (Sandbox Code Playgroud)

我想让用户通过按各种键来驱动程序。例如“按 S 正常关闭远程设备,按 K 杀死,按 R 重新启动”。所有这些操作都需要在大循环内发生——我的伪代码中的“也许做些事情,或者只是看”注释。如果没有按下任何键,程序应该一直循环。

我不确定如何在 while True: time.sleep(1) 循环的上下文中完成键盘阅读。

python

5
推荐指数
1
解决办法
8455
查看次数

Python不断解析控制台输入

我正在编写一个Python脚本来解析来自QR阅读器(系统被视为键盘)的输入.

目前我正在使用,raw_input()但此功能等待EOF /行尾符号,以便将收到的字符串提交给程序.我想知道是否有一种方法可以连续解析输入字符串,而不仅仅是在行末端限制的块中.

在实践中: - 在python中是否有一种方法可以异步并连续地解析控制台输入?- 有没有办法改变raw_input()(或等效函数)寻找另一个字符,以便将字符串读取提交到程序中?

python console raw-input

5
推荐指数
1
解决办法
1699
查看次数

杀死子进程后外壳挂起

我知道在 SO 上有很多类似的问题,比如这个这个,也许还有更多,但似乎没有一个适用于我的特定情况。我对subprocess.Popen()工作原理缺乏了解也无济于事。

我想要实现的是:启动一个子进程(一个命令行收音机播放器),它也向终端输出数据,也可以接收输入——等待一段时间——终止子进程——退出shell。我在 OSX 10.9 上运行 python 2.7

案例 1. 这将启动广播播放器(但仅限音频!),终止进程,退出。

import subprocess
import time

p = subprocess.Popen(['/bin/bash', '-c', 'mplayer http://173.239.76.147:8090'],
                     stdin=subprocess.PIPE, stdout=subprocess.PIPE, shell=False,
                     stderr=subprocess.STDOUT)
time.sleep(5)
p.kill()
Run Code Online (Sandbox Code Playgroud)

案例 2. 这将启动收音机播放器,输出诸如收音机名称、歌曲、比特率等信息并接受输入。它终止子进程,但它从不存在 shell,即使使用“Ctrl-C”,终端也无法使用。

p = subprocess.Popen(['/bin/bash', '-c', 'mplayer http://173.239.76.147:8090'],
                     shell=False)
time.sleep(5)
p.kill()
Run Code Online (Sandbox Code Playgroud)

关于如何做到这一点的任何想法?我什至在想,如果没有其他选择,是否有可能为子进程打开一个slave-shell(当然这也是我不知道的事情)。谢谢!

python subprocess

5
推荐指数
1
解决办法
2465
查看次数

确定python中的按键长度

假设我想在python中创建一个非常简单的程序,指示按下一个键的时间.因此,如果我键入并按住j键片一会儿,我正在寻找一个能够显示信息的程序the key 'j' was pressed for 1.1 seconds.

根据我的理解,应该实现的方式是检测KEYDOWN事件和KEYUP事件并对其加时间戳,并对时间戳进行适当的减法.因此,检测KEYDOWN和KEYUP事件就足够了.

关于检测单个按键或检测单个字符输入的SO有各种各样的问题和答案,例如这一个这个,它们都使用某种形式的getch.我查看了python curses库,从我可以看出,密钥检测的主要形式也是单字符getch()的形式.但是这些没有检测到按键的长度 - 它们只检测KEYDOWN.

我认识到检测按键的长度是游戏中的必要任务,所以我希望pygame有方法来检测按键持续时间.但我希望可以使用更纤薄,更直接的库来检测按键持续时间.

python keypress

5
推荐指数
1
解决办法
2291
查看次数

在 Python 中获取单个字符作为输入,无需按 Enter 键(类似于 C++ 中的 getch)

首先,我对Python完全陌生,刚刚开始学习它。我知道很多关于 C++ 的东西,但我只是尝试用 Python 实现其中一些。

我已经对其进行了大量搜索,但找不到任何符合我要求的解决方案。请看下面的代码,

import os

class _Getch:
    """Gets a single character from standard input.  Does not echo to the
screen."""
    def __init__(self):
    try:
        self.impl = _GetchWindows()
    except:
        print("Error!")
    def __call__(self): return self.impl()

class _GetchWindows:
    def __init__(self):
        import msvcrt

    def __call__(self):
        import msvcrt
        return msvcrt.getch()



def mainfun():
    check = fh = True
    while check:
        fh = True
        arr = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
        print ("Welcome to Tic Tac Toe Game!!!\n\n")
        print("Enter 1 to …
Run Code Online (Sandbox Code Playgroud)

python user-input menu getchar python-3.x

5
推荐指数
1
解决办法
3800
查看次数

用 O(1) 空间逐行读取数字

许多编码挑战在同一行中有多个数字,通常第一行告诉多数字行中有多少个数字:

4
31 415 9 26
Run Code Online (Sandbox Code Playgroud)

通常我只是读取整行,然后.split()将字符串映射到数字。

但是有没有一种好方法可以一次读取整行,而是一次读取一个数字呢?为了节省内存,要么因为我不能或不想整行读入内存。我只想使用 O(1) 空间(假设数字很小/有界,所以它们的大小是 O(1) )。不必绝对最小,例如,如果解决方案在内部一次读取完整的 4 KB 内存页,那没关系,仍然是 O(1) 并且相对较小。对于用例,请考虑一行上有数百万个数字,并且内存限制比方说低于 1 MB。

在 C++ 中我会这样做:

4
31 415 9 26
Run Code Online (Sandbox Code Playgroud)

我编写了这个生成器,它接受一个文件对象并为我提供一个字符串迭代器。对于上面的示例,它生成字符串'4''31''415''9''26'它一次读取一个字符,并按照以下确定的空格字符进行分割.isspace()

def split(file):
    value = []
    while char := file.read(1):
        if char.isspace():
            if value:
                yield ''.join(value)
            value.clear()
        else:
            value.append(char)
    if value:
        yield ''.join(value)
Run Code Online (Sandbox Code Playgroud)

但这当然是极其复杂和缓慢的,我什至不知道这种str.isspace用法是否等同于str.split空白。它只是说明了实现我想要的目标的一种方法。

编辑:这是一种更简单的方法,但仍然比我想要的更复杂和缓慢。我正在寻找一些内置的方法,以 …

python memory space-complexity

5
推荐指数
0
解决办法
201
查看次数

python 从命令行获取箭头键

我有一个脚本应该与用户输入交互(按箭头键),但我无法获取按键。我尝试了 raw_input 和其他一些函数,但它们不起作用。这是我的示例代码,它应该是什么样子(可以在另一个函数中将运行 bool 设置为 False)

running = True
while running:
    #if input == Arrow_UP:
    #    do_Sth
    #elif ...
    display()
    time.sleep(1)
Run Code Online (Sandbox Code Playgroud)

另一个问题是,如何每秒只调用一次显示函数,但立即对输入做出反应?

python

4
推荐指数
1
解决办法
2万
查看次数