Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows Python多处理标准输入_Windows_Python 3.x_Process_Multiprocessing_Stdin - Fatal编程技术网

Windows Python多处理标准输入

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工作正常。我想我在上面找到了以下帮助,所以我测试了它,发现在线程模块中,这一切都很好

在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编写的):

如果我没有正确地实现它,希望有人能够解释这是否是预期的功能,或者其他一些有用的信息


谢谢。

当您查看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)
。因此,您正在从Win32
NUL
设备(即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