input()阻止Windows 8中的其他python进程(python 3.3)

一个多线程的跨平台python3.3应用程序上,我遇到了一些我不期待的奇怪的行为,我不确定是预期的。问题是Windows 8调用一个线程中的input()方法阻止其他线程,直到它完成。我已经在三个Linux,两个Windows 7和一个Windows 8计算机上测试了下面的示例脚本,这种行为只在Windows 8计算机上观察到。这是Windows 8的预期行为吗?

test.py:

import subprocess,threading,time

def ui():
    i = input("-->")
    print(i)

def loop():
    i = 0
    f = 'sky.{}'.format(i)
    p = subprocess.Popen(['python','copy.py','sky1',f])
    t = time.time()
    while time.time() < t+15:
        if p.poll() != None:
            print(i)
            time.sleep(3)
            i+=1
            f = 'sky.{}'.format(i)
            p = subprocess.Popen(['python',f])
    p.terminate()
    p.wait()

def start():
    t1 = threading.Thread(target=ui)
    t2 = threading.Thread(target=loop)
    t1.start()
    t2.start()
    return t2

t2 = start()
t2.join()
print('done')

copy.py:

import shutil
import sys

src = sys.argv[1]
dst = sys.argv[2]

print('copying \'{0}\' to \'{1}\''.format(src,dst))
shutil.copy(src,dst)

更新:
在尝试其中一个建议时,我意识到我赶上了一个结论,缺少一些明显的东西。对于开始虚假的开始,我深表歉意。

由于Schollii建议只使用线程(没有子进程或python文件)导致所有线程前进,所以问题实际上是在一个python进程中使用input()将导致其他python进程阻止/不运行(我不知道什么正在进行)。此外,它似乎只是受影响的python进程。如果我使用上面显示的相同代码(通过一些修改)来执行具有subprocess.Popen的非python可执行文件,它们将按预期运行。

总结:

>使用子进程来执行非python可执行文件:按预期方式工作,并且没有对input()的任何调用
>使用子进程执行python可执行文件:如果在原始进程中调用input(),则已创建的进程似乎不会运行。
>使用子进程在新进程中调用input()而不是原始进程来创建python进程:对input()调用将阻止“main”进程产生的所有python进程。

侧面注意:我没有Windows 8平台,所以调试/测试可能会有点慢。

因为Python 3.0-3.2中的输入有几个问题,所以这个方法几乎没有变化。

我们可能会再次出现新的错误

你可以尝试以下变体,这是raw_input()“back port”(在Python 2.x中可以使用):

...
i = eval(input("-->"))
...

相关文章

Windows2012R2备用域控搭建 前置操作 域控主域控的主dns:自...
主域控角色迁移和夺取(转载) 转载自:http://yupeizhi.blo...
Windows2012R2 NTP时间同步 Windows2012R2里没有了internet时...
Windows注册表操作基础代码 Windows下对注册表进行操作使用的...
黑客常用WinAPI函数整理之前的博客写了很多关于Windows编程的...
一个简单的Windows Socket可复用框架说起网络编程,无非是建...