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

前端之家收集整理的这篇文章主要介绍了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)

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

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

总结:

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

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

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

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

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

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

猜你在找的Windows相关文章