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正确实施它,或者其他一些有用的信息。
谢谢。
当你看看蟒蛇实施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
的[编程准则](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
事实上,这确实奏效。我有一种感觉,当我读到os时,它可能是这样简单的.devnull我怀疑我可能需要做些事情来改变这种状态。 我改变了上面的程序,在函数2的while循环之前包含了sys.stdin = open(0)并且成功了。 希望别人会觉得这些信息有用。感谢您的帮助eryksun。 – user2398421