2012-03-18 210 views
1

我試圖從另一個文件調用文件中的函數。我有一個名爲client.py的文件。在那個文件中有一個名爲reset()的函數,它重置客戶端。我有另一個文件controller.py,我想從控制器調用client.reset(),以便重置客戶端,即應該在客戶端而不是控制器內運行。從另一個python文件調用python文件中的函數

有沒有辦法做到這一點?

編輯:

controller.py和client.py作爲單獨的進程運行。 import方法將另一個模塊的函數導入到其導入文件的範圍中。這不是我想要的。我想要一個方法controller.py可以使client.py自己調用reset()。

+0

你通過一個Python教程/書走向何方?任何體面的人都應該在關鍵字「模塊」下加以說明。 – delnan 2012-03-18 18:26:49

+0

「內部運行」是什麼意思?這裏顯而易見的解決方案是導入客戶端,並從控制器調用client.reset(),但似乎這不是你想要的? – mfrankli 2012-03-18 18:26:57

+0

你有兩個不同的進程,從'controller.py'和'client.py'開始? – 2012-03-18 18:26:59

回答

2

儘管有人建議通過子進程PIPE與進程通信,但問題仍然是client.py進程需要預期並監聽stdin上的數據,以便爲其執行操作。目前還不清楚你的客戶在做什麼,但也許它確實只是坐在從標準輸入讀取循環。

@mfrankli在他的回答中給出了python IPC的一般鏈接。但更具體的說,你需要在你的client.py中爲控制器發送消息的一些類型的監聽實現。這裏有一些不同的方法:

  1. xmlrpc - 它非常簡單易用。
  2. Zeromqpyzmq bindings:如果您想更多地控制系統的通信方式,這是一個更強大的選項。您可以使用發佈/訂閱模式讓您的客戶端收聽控制器。

如果你有興趣在ZeroMQ路線,其實我有一個簡單的項目創建使用它的RPC設置:https://github.com/justinfx/pyRpc

+0

看來海報的問題的答案取決於客戶端在做什麼。從問題的評論之一: 「用戶將與controller.py進行交互...將點擊控制器上的重置客戶端按鈕」 我得到的印象是,客戶端本質上是等待輸入,然後作用於它。但是,在一般情況下,您的答案可能是SO上更好的資源IPC。 – mfrankli 2012-03-18 19:13:20

+0

@mfrankli:我同意。他的問題非常模棱兩可,這就是爲什麼我認爲別人甚至不打算寫答案。我們現在只能假設。 Ya,他可能正在使用他的控制器運行某種類型的GUI框架。如果他偶然使用PyQt,那麼我的pyRpc工具將立即爲他提供一個示例:-) – jdi 2012-03-18 19:24:37

+0

@jdi我的客戶(兩個分離進程)是尋路模擬器。用戶將選擇算法(與每個客戶端不同),控制器上的模擬速度等,我打算髮送給各個客戶端。另外我希望他們在同一時間開始模擬。你有任何關於xmlrpc的教程嗎? – AccurateEstimate 2012-03-18 19:26:45

2

要在子流程之間進行通信,您需要按照@ Sven在註釋中的建議使用inter-process communication中的一些方法。如果客戶端只需要與控制器進行通信,那麼您將需要使用stdin/stdout管道。當你調用subprocess.Popen()時,你需要包含stdin = PIPE。

+0

我應該注意到,我不是專家,但我已經使用了它,它的工作,afaik – mfrankli 2012-03-18 18:50:13

相關問題