Python的多标准输入输入

问题描述:

编写和测试在Python中的所有代码3.4的Windows 7Python的多标准输入输入

我设计一个控制台应用程序,有一个需要从命令行(WIN操作系统)使用标准输入来发出命令,并改变程序的运行模式。该程序依赖于多处理来处理cpu绑定负载以传播到多个处理器。

我正在使用stdout来监视该状态和一些基本的返回信息,并根据返回的控制台信息发出命令来加载不同的子进程。

这是我发现问题的地方。我无法让多处理模块接受stdin输入,但stdout工作得很好。我认为在stack上找到了以下帮助所以我测试了它,发现使用线程模块,这一切都很好,除了stdout的所有输出都暂停,直到每次标准输入由于使用标准输入阻止的GIL锁而循环。

我会说我已经用msvcrt.kbhit()实现了一个解决方案。但是,我不禁要问,多处理功能中是否存在某种使stdin不读取任何数据的错误。我尝试了多种方法,并且在使用多处理时没有任何工作。甚至尝试使用队列,但我没有尝试使用池或其他多处理方法。

我也没有尝试在我的Linux机器上,因为我专注于试图让它工作。

这里被简化测试代码,而无需实现预期的功能(提醒这是用Python编写的3.4 - WIN7):

import sys 
import time 
from multiprocessing import Process 

def function1(): 
    while True: 
     print("Function 1") 
     time.sleep(1.33) 

def function2(): 
    while True: 
     print("Function 2") 
     c = sys.stdin.read(1) # Does not appear to be waiting for read before continuing loop. 
     sys.stdout.write(c) #nothing in 'c' 
     sys.stdout.write(".") #checking to see if it works at all. 
     print(str(c)) #trying something else, still nothing in 'c' 
     time.sleep(1.66) 

if __name__ == "__main__": 
    p1 = Process(target=function1) 
    p2 = Process(target=function2) 
    p1.start() 
    p2.start() 

希望有人能在这是否意功能阐明,如果我不” t正确实施它,或者其他一些有用的信息。

谢谢。

+0

的[编程准则](https://docs.python.org/3/ library/multiprocessing.html#programming-guidelines)讨论如何将sys.stdin设置为open(os.devnull)。因此,您正在从Win32'NUL'设备(即NT' \ Device \ Null')读取数据。在'function2'中,你可以将它恢复为'sys.stdin = open(0)'。 – eryksun

+0

事实上,这确实奏效。我有一种感觉,当我读到os时,它可能是这样简单的.devnull我怀疑我可能需要做些事情来改变这种状态。 我改变了上面的程序,在函数2的while循环之前包含了sys.stdin = open(0)并且成功了。 希望别人会觉得这些信息有用。感谢您的帮助eryksun。 – user2398421

当你看看蟒蛇实施multiprocessing.Process._bootstrap()你会看到:

if sys.stdin is not None: 
    try: 
     sys.stdin.close() 
     sys.stdin = open(os.devnull) 
    except (OSError, ValueError): 
     pass 

您也可以通过使用证实了这一点:

>>> import sys 
>>> import multiprocessing 
>>> def func(): 
...  print(sys.stdin) 
... 
>>> p = multiprocessing.Process(target=func) 
>>> p.start() 
>>> <_io.TextIOWrapper name='/dev/null' mode='r' encoding='UTF-8'> 

而且从os.devnull阅读立即返回空的结果:

>>> import os 
>>> f = open(os.devnull) 
>>> f.read(1) 
'' 

你可以在这附近工作通过使用open(0)

文件是字符串或字节对象,提供路径名被打开的文件或文件的一个整数文件描述符(绝对或相对于当前工作目录)是包裹

文件描述符是对应的小整数:

而且"0 file descriptor"(如果文件描述符给出,它是当返回I/O对象被关闭,除非closefd设置为False关闭。)到当前进程已打开的文件。例如,标准输入通常文件描述符0,标准输出是1,以及标准误差为2:

>>> def func(): 
...  sys.stdin = open(0) 
...  print(sys.stdin) 
...  c = sys.stdin.read(1) 
...  print('Got', c) 
... 
>>> multiprocessing.Process(target=func).start() 
>>> <_io.TextIOWrapper name=0 mode='r' encoding='UTF-8'> 
Got a