簡體   English   中英

Python IDLE 運行代碼與其他 IDE 不同

[英]Python IDLE running code differently than other IDEs

我正在嘗試讓線程與 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 中運行,因此它需要在這里工作。

顧名思義,它主要是一個開發(和學習)環境。 它特別針對初學者。 用於運行完成的代碼充其量是次要的,通常不是優勢。

IDLE Doc 章節,可以通過 Help => IDLE Help 在 IDLE 本身中查看,有一個小節 (3.3) IDLE-console 差異。 它始於

除了極少數例外,使用 IDLE 執行 Python 代碼的結果與在控制台窗口中執行相同代碼的結果相同。 但是,不同的界面和操作偶爾會影響可見的結果。

操作上的最大區別在於您的代碼在單獨的 Python 進程中執行,標准輸入和輸出通過套接字連接。 這意味着程序的所有 stdout 輸出都通過 IDLE 代碼,該代碼將其插入到 tk 文本小部件中,而不是直接發送到操作系統屏幕管理器。

在 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

(我不知道為什么 '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:

在命令提示符中以相同的時間輸入相同的標題:

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

如果我更好地理解相關的 IDLE 代碼,我會將中斷線插入到提示之前的一行中。 我也可能在 input() 期間做同樣的事情。 幸運的是,線程或異步任務的輸出並不常見,尤其是對於初學者。

附錄:如果使用python -m idlelib -n從命令行運行 IDLE,它會在一個進程中運行,並且不會阻止線程輸出。 不知道這個模式下會不會出現其他問題(目前沒有測試)。

我們(IDLE 維護者)同意應該在正常的兩個進程模式下停止阻塞,並且知道它為什么會發生。

已經討論了解決方案,但尚未實施。 空閑 Shell - input() 阻止來自另一個線程的 output #83905 似乎使用 IDLE 解決它的唯一方法是使用“-n”命令行選項啟動 IDLE,以阻止 IDLE 啟動其子進程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM