Windows Python多处理标准输入
在python 3.4 windows 7上编写和测试的所有代码 我正在设计一个控制台应用程序,需要从命令行(WinOS)使用stdin来发出命令并更改程序的操作模式。该程序依赖于多处理来处理扩展到多个处理器的cpu负载 我正在使用stdout监视该状态和一些基本的返回信息,并使用stdin根据返回的控制台信息发出命令来加载不同的子进程 这就是我发现问题的地方。我无法让多处理模块接受stdin输入,但stdout工作正常。我想我在上面找到了以下帮助,所以我测试了它,发现在线程模块中,这一切都很好,除了所有到stdout的输出都会暂停,直到每次stdin被循环,这是由于使用stdin阻塞的GIL lock 我要说的是,我已经成功地使用msvcrt.kbhit()实现了一个变通方案。然而,我不禁想知道,在多处理功能中是否存在某种使stdin无法读取任何数据的缺陷。我尝试了许多方法,但在使用多处理时没有任何效果。甚至尝试使用队列,但我没有尝试池或任何其他来自多处理的方法 我也没有在我的linux机器上尝试这一点,因为我专注于让它工作 以下是未按预期运行的简化测试代码(请注意,这是用Python 3.4-win7编写的): 如果我没有正确地实现它,希望有人能够解释这是否是预期的功能,或者其他一些有用的信息Windows Python多处理标准输入,windows,python-3.x,process,multiprocessing,stdin,Windows,Python 3.x,Process,Multiprocessing,Stdin,在python 3.4 windows 7上编写和测试的所有代码 我正在设计一个控制台应用程序,需要从命令行(WinOS)使用stdin来发出命令并更改程序的操作模式。该程序依赖于多处理来处理扩展到多个处理器的cpu负载 我正在使用stdout监视该状态和一些基本的返回信息,并使用stdin根据返回的控制台信息发出命令来加载不同的子进程 这就是我发现问题的地方。我无法让多处理模块接受stdin输入,但stdout工作正常。我想我在上面找到了以下帮助,所以我测试了它,发现在线程模块中,这一切都很好
谢谢。当您查看Pythons的实现时,您将看到:
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'>
您可以使用以下方法解决此问题:
file是一个字符串或字节对象,提供要打开的文件的路径名(绝对或相对于当前工作目录),或者是要包装的文件的整数文件描述符。(如果给定了文件描述符,则在关闭返回的I/O对象时关闭该描述符,除非closefd设置为False。)
以及:
文件描述符是与当前进程打开的文件相对应的小整数。例如,标准输入通常为文件描述符0,标准输出为1,标准错误为2:
>>def func():
... sys.stdin=打开(0)
... 打印(系统标准)
... c=系统标准读数(1)
... 打印('Got',c)
...
>>>multiprocessing.Process(target=func.start())
>>>
有一个
讨论如何将sys.stdin
设置为open(os.devnull)
。因此,您正在从Win32NUL
设备(即NT\device\Null
)读取数据。在function2
中,您可以将其还原为sys.stdin=open(0)
。这确实有效。当我阅读os.devnull时,我有一种感觉,可能是这样简单,我怀疑我可能需要做些什么来改变这种状态。我将上述程序更改为在函数2中的while循环之前包含sys.stdin=open(0),并获得了成功。希望其他人会发现这些信息很有用。谢谢您的帮助。我想应该是os.fdopen(0)
。对于我来说,open(0)
抱怨它需要一个字符串。
>>> 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'>
>>> import os
>>> f = open(os.devnull)
>>> f.read(1)
''
>>> 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