Python IDLE 运行 代码与其他 IDE 不同

Python IDLE running code differently than other IDEs

我正在尝试让线程与套接字网络一起工作以接受客户端。我之前用的很好,但是现在我发现了一个问题。

代码如下:

clients = []

def myFunction():    #Not too relevant I think
    server.listen(0)
    conn, addr = server.accept()
    print(conn)
    clients.append(conn, addr)
    threading.Thread(myFunction)

threading.Thread(myFunction)
input("Hit enter to finish...")
print(clients)

现在这应该 return 像这样,它在我尝试过的所有 IDE(PyCharm、Sublime 文本编辑器等)上都能做到:

Hit enter to finish...
*2 users connect*
192.168.0.5 # this is the contents of conn
192.168.0.12
*hit enter*
192.168.0.5, 192.168.0.12

然而,在 Python 自己的 IDLE 中,线程似乎无法打印任何东西,直到我按下 Enter,使用完全相同的代码,如下所示:

Hit enter to finish...
*2 users connect*
*hit enter*
192.168.0.5
192.168.0.12
192.168.0.5, 192.168.0.12

这不是我想要的,因为我的代码在完成后会 运行 在 Python 空闲,因此它需要在这里工作。

正如 IDLE 的名字所暗示的,它主要是一个开发(和学习)环境。它特别针对初学者。使用 运行ning 完成的代码充其量是次要的,通常不是优势。

IDLE Doc chapter,可以在 IDLE 本身中通过帮助 => IDLE 帮助查看,它有一个小节 (3.3) IDLE-console 差异。开始

With rare exceptions, the result of executing Python code with IDLE is intended to be the same as executing the same code in a console window. However, the different interface and operation occasionally affect visible results.

操作上的最大区别在于您的代码在单独的 Python 进程中执行,标准输入和输出通过套接字连接。这意味着您程序的所有 stdout 输出都通过 IDLE 代码,将其插入 tk 文本小部件,而不是直接发送到 OS 屏幕管理器。

对于 input(),IDLE 停止显示输出,直到用户点击 return。 (即使提示符为空也是如此。)我认为这是对在用户输入中间散布输出的改进。您的代码不能按原样 运行,但以下代码可以。

导入线程,时间

def myFunction():
    time.sleep(1)
    print('Interruption from thread')

thread = threading.Thread(target=myFunction)
thread.start()
s =input("Hit enter to finish...")
print(s)

在 Win10 的 IDLE 3.7.0b3 中,我看到类似

的内容
Hit enter to finish...skjfsjflsjfljsflsfjls
Interruption from threadskjfsjflsjfljsflsfjls

(不知道为什么'thread'后面的'\n'被压掉了。) 在命令提示符中我看到

Hit enter to finish...ksjfkjsInterruption from thread
fjsfjsfkjsfljksfjkfs
ksjfkjsfjsfjsfkjsfljksfjkfs

>>>之后输入代码也会出现同样的问题。将我的代码更改为

import threading, time

def myFunction():
    time.sleep(2)
    print('Interruption from thread')

thread = threading.Thread(target=myFunction)
thread.start()

空闲时:

>>> Interruption from thread
if a = 3:

在命令提示符中输入相同的 header 并使用相同的时间:

C:\Users\Terry>python -i -m a.tem
>>> if aInterruption from thread
 = 3

如果我能更好地理解相关的 IDLE 代码,我会在提示符之前的一行插入中断线。我也可能在 input() 期间做同样的事情。幸运的是,线程或异步任务的输出并不常见,尤其是对于初学者。

附录:如果一个 运行s 从带有 python -m idlelib -n 的命令行中空闲,它在一个进程中 运行s 并且线程输出不会被阻塞。不知道这个模式下会不会出现其他问题(暂未测试)

我们(IDLE 维护者)同意阻塞应该在正常的两个进程模式下停止,并且知道为什么会发生。