2014-07-18 129 views
1

我正在實現一個Python插件,它是更大的C++程序的一部分。該程序的目標是允許用戶在Python中輸入命令的操作。它目前從C++函數接收一個字符串,並通過exec()函數運行它。然後用戶可以使用API​​來影響較大C++程序的更改。在Python中暫停執行

我正在處理的當前功能是暫停執行功能。它需要記住它在代碼執行中的位置以及任何局部變量的狀態,並且一旦滿足條件就恢復執行。我對Python不是很熟悉,我想要一些建議如何實現這個功能。我的第一個設計思路:

1)使用yield命令。 這在開始時似乎是一個好主意,因爲當你使用下一個命令時,它會記住我需要的所有東西,但問題是yield只能返回到調用堆棧中的前一級別,據我所知。所以如果用戶調用一個產生它的函數,它將簡單地返回到用戶的代碼,而不是更大的C++程序。據我所知,沒有辦法將yield命令傳播到堆棧中?

2)線程 創建一個主python線程爲每個命令創建一個線程。這個主線程會爲每個執行的命令產生一個線程,並在完成時將其終止。如果需要暫停和重新啓動,可以通過鎖隊列來完成。

這是我提出的唯一兩個選項。我不確定yield函數是可行的還是它的設計目的。我認爲線程方法可行,但可能是過度的,需要很長時間才能發展。我也在Python中尋找某種任務模塊,但找不到我正在尋找的東西。我想知道是否有人有任何其他建議,因爲我對Python不太熟悉。

編輯:正如評論中提到的,我沒有解釋腳本「暫停」時需要發生什麼。 python插件需要允許C++程序繼續執行。在我看來,這意味着A)返回,如果我們正在談論單線程方法,或B)發送消息(函數調用?)到C++

編輯編輯:如上所述,我沒有完全解釋問題描述。我將做出另一篇文章,對目前存在的內容以及需要發生的事情以及提供一些sudo代碼做更好的說明。我是Stack Overflow的新手,所以如果這不是合適的答案,請讓我知道。

+2

我瞭解單詞,但我認爲你需要在僞代碼或其他內容中表達你的問題......我不明白你的問題是什麼......'''time.sleep'會使python腳本暫停......但林相當肯定這不是你在這裏問 –

+0

我第二。你需要解釋一下你想要的東西,只要讓你的腳本暫停一段時間就無法實現。目前很難準確掌握你想要做什麼。 – JBentley

+0

感謝您幫助澄清我需要包含在我的問題陳述中的內容。 – Brian

回答

0

如果您需要與C程序進行通信,那麼套接字可能是要走的路。

https://docs.python.org/2/library/socket.html

一個你的兩個方案作爲套接字服務器,另一個連接到該作爲套接字客戶端。當您希望繼續使用C++程序時,您可以使用socket.send()來發送繼續消息。那麼你的Python程序將使用socket.recv(),這將導致它等待,直到它收到C++程序返回的消息。

如果您需要兩個程序互相發送信號,這可能是最安全的方法。

2

無論何時以Python發送信號,立即暫停執行,直到正在使用的任何信號處理函數完成執行;在那一點上,執行繼續它離開的地方。我的建議是使用用戶定義的信號之一(signal.SIGUSR1signal.SIGUSR2)。下面一起來看看signal文檔:

https://docs.python.org/2/library/signal.html

在節目的開頭,你會定義一個信號處理函數,像這樣:在主程序

def signal_pause(signum, frame): 
    if signum == signal.SIGUSR1: 
    # Do your pause here - function processing, etc 
    else: 
    pass 

然後某處,你會將剛剛創建的信號處理器轉換爲默認信號處理器:

signal.signal(signal.SIGUSR1, signal_pause) 

最後,只要你想暫停,你會送SIGUSR1信號,像這樣:

os.kill(os.getpid(),signal.SIGUSR1) 

您的代碼將立即暫停,保存其狀態,頭向signal_pause功能做任何你需要做的。一旦該功能退出,正常程序執行將恢復。

編輯:這裏假設你想在暫停程序時做一些複雜的事情。如果您只想等待幾秒鐘或詢問用戶輸入,則可以使用一些更簡單的方法(分別爲time.sleepinput)。

編輯編輯:這假定你在Unix系統上。

+0

感謝您的回答!這將是一個理想的解決方案,但該系統部署到多個平臺。我想我需要一個可以在沒有OS調用的情況下工作的解決方案 – Brian

+0

@布賴恩啊,好的。也許套接字連接更多是你的東西?通過套接字向C++發送一條消息,告訴它繼續,然後在Python腳本繼續之前等待答覆?我不知道它們有多普遍,但它們幾乎是進程間通信的標準。 – TheSoundDefense