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

时间:2018-04-30 21:18:43

标签: python python-idle

我试图让线程与Socket网络一起接受客户端。我工作得很好,但现在我发现了一个问题。

以下是代码:

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)

现在这应该返回这样的东西,它在我尝试过的所有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中运行,所以它需要在这里工作。

TLDR:
代码在Python IDLE中的运行方式与在其他IDE中运行的代码完全相同。请参阅上面的代码示例。

1 个答案:

答案 0 :(得分:0)

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

IDLE Doc chapter,可以使用Help =>在IDLE中查看IDLE Help,有一个子段(3.3)IDLE-console差异。它开始

  

除了极少数例外,使用IDLE执行Python代码的结果与在控制台窗口中执行相同代码的结果相同。但是,不同的界面和操作偶尔会影响可见结果。

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

在input()的情况下,IDLE在用户返回之前停止显示输出。 (即使是空提示也是如此。)我认为这是对用户输入中间输出分散的改进。您的代码无法按原样运行,但以下情况可以运行。

导入线程,时间

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

(我不知道为什么' \ 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()

IDLE:

>>> Interruption from thread
if a = 3:

在命令提示符中以相同的时间输入相同的标题:

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

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