如何为Windows重写此多处理代码?

时间:2019-10-05 23:19:42

标签: python python-3.x linux windows multiprocessing

我当前正在使用多处理程序,因此我可以在运行其他代码时获得用户输入。此版本的代码对我来说在ubuntu 19.04上运行,但是对我的朋友而言,它在Windows上不起作用。

import getch
import time
from multiprocessing import Process, Queue

prev_user_input = ' '
user_input = ' '


# Getting input from the user
queue = Queue(1)

def get_input():
    char = ' '
    while char != 'x':
        char = getch.getch()
        queue.put(char)

# Starting the process that gets user input
proc = Process(target=get_input)
proc.start()


while True:

    # Getting the users last input
    while not queue.empty():
        user_input = queue.get()

    # Only print user_input if it changes
    if prev_user_input != user_input:
        print(user_input)
        prev_user_input = user_input

    time.sleep(1/10)

如何使此代码在Windows上工作?

用户输入也落后一个输入。如果用户按下按钮,则仅在按下另一个按钮后才打印。有关如何解决此问题的解决方案也将有所帮助。

编辑1: 他正在使用Python 3.7.4,而我正在使用3.7.3。

我按照建议尝试了此代码

import msvcrt
import time
from multiprocessing import Process, Queue

prev_user_input = ' '
user_input = ' '


# Getting input from the user
queue = Queue(1)

def get_input():
    char = ' '
    while char != 'x':
        char = msvcrt.getch()
        queue.put(char)

# Starting the process that gets user input
if __name__ == '__main__':
    proc = Process(target=get_input)
    proc.start()


    while True:

        # Getting the users last input
        while not queue.empty():
            user_input = queue.get()

        # Only print user_input if it changes
        if prev_user_input != user_input:
            print(user_input)
            prev_user_input = user_input

        time.sleep(1/10)

但是没有打印字符。

编辑2: 我在Windows上使用msvcrt模块,在ubuntu上使用getch模块。抱歉,您在帖子的前面没有对此进行澄清。

1 个答案:

答案 0 :(得分:0)

以下内容适用于Windows。它包含了我在您的问题下的评论中建议的所有更改,包括关于单独的内存空间的最后一个更改。

使用ubuntu的getch()版本,类似的东西也应该工作,尽管我尚未对其进行测试。 on主过程创建Queue并将其作为参数传递给get_input()目标函数,因此它们都使用同一对象交换数据。

我还decode() msvcrt.getch()返回的bytes对象,将其转换为(1个字符)Unicode UTF-8字符串。

import msvcrt
import time
from multiprocessing import Process, Queue

prev_user_input = ' '
user_input = ' '


def get_input(queue):
    char = ' '
    while char != b'x':
        char = msvcrt.getch()
        queue.put(char.decode())  # Convert to utf-8 string.

if __name__ == '__main__':
    # Getting input from the user.
    queue = Queue(1)

    # Starting the process that gets user input.
    proc = Process(target=get_input, args=(queue,))
    proc.start()


    while True:

        # Getting the users last input
        while not queue.empty():
            user_input = queue.get()

        # Only print user_input if it changes
        if prev_user_input != user_input:
            print(user_input)
            prev_user_input = user_input

        time.sleep(1/10)

更新

要隐藏操作系统差异并提高代码的可移植性,您可以执行如下所示的import处理,这也使您可以像在代码中所做的那样定义get_input()函数在您的问题中:

import os
import time
from multiprocessing import Process, Queue

try:
    import msvcrt
    getch = msvcrt.getwch  # Wide char variant of getch() that returns Unicode.
except ModuleNotFoundError:  # Not Windows OS - no msvcrt.
    from getch import getch

prev_user_input = ' '
user_input = ' '


def get_input(queue):
    char = ' '
    while char != 'x':
        char = getch()
        queue.put(char)


if __name__ == '__main__':
    # For getting input from the user.
    queue = Queue(1)

    # Starting the process that gets user input.

    .
    .
    .