2017-04-04 83 views
0

首先,我對Python很陌生。我也搜索了一個解決方案,但我想通常的做法(subprocess.popen)不會在我的情況下工作。Python - 將參數傳遞給已經運行的進程

我必須將參數傳遞給已經運行的python腳本中的監聽器,而不必一次又一次地啓動腳本。有一個例子如何傳遞消息到液晶屏:

function printMsgText(message_text) 
local f = io.popen("home/test/show_message.py '" .. message_text .. "'") 
end 

以上這LUA腳本定義了被調用每次一個消息被收到的過程。該過程稱爲(show_message.py)看起來像這樣:

import sys 
from sense_hat import SenseHat 
sense = SenseHat() 
sense.clear() 
sense.show_message(sys.argv[1]) 

我需要類似的東西,只是沒有在底色運行的另一個腳本,所以show_message.py不是最後的過程,但需要通過論證/消息給另一個,已經在運行的腳本。我的想法是讓show_message.py將消息打印到控制檯並在主進程中使用sys.argv,但我有點害怕它會變得混亂。

有沒有簡單的方法來做到這一點? 親切的問候

編輯:

主要腳本控制步進電機。根據用戶輸入,電機驅動預定義的步數。腳本等待用戶輸入的部分看起來像這樣:

while wait: 
      user_position = input("Where do you wanna go? (0, 1, 2, back): ") 
      wait = False 
      # Console output 
      print("Position: " + str(user_position)) 

      if user_position == "0": 
       stepper.set_target_position(position_zero) 
       wait = True 
      elif user_position == "1": 
       stepper.set_target_position(position_one 
       wait = True 
      elif user_position == "2": 
       stepper.set_target_position(position_two) 
       wait = True 
      elif user_position == "back": 
       break 

現在我需要經由其被設計我上述方式web應用來傳遞所希望的位置(例如調用一個LUA腳本每次傳遞一個變量/參數)而不是通過控制檯。

回答

1

您可以使用某種消息傳遞庫,它允許您在進程之間進行通信。 ZeroMQ是一個不錯的選擇,並且有python綁定。

1

一旦進程正在運行,它將不會重新評估其命令行參數。您需要其他方式與它溝通。這通常稱爲進程間通信(IPC),並且有幾種方法來實現它。這裏有幾個:

  • 文件
  • 管(在支持它們的平臺)
  • 共享存儲器
  • 套接字通信
  • 消息傳遞
  • RPC

大概最平易近人的方式是標準流(STDIN,STDOUT),例如,您提到的subprocess.popen()。但是這需要溝通過程之間的親子關係。也許你可以走這條路。

Python的另一種方式,如果你想避免親子關係,我已經取得了良好的經驗是Pyro。這很容易使用和運行良好,雖然有一些性能損失。這也是一種非常「基礎設施」的方式,兩個流程都必須進行編碼才能使用它。

+0

非常感謝。根據我的理解,親子關係會給我帶來一些問題,因爲每次我發送一條消息,父進程就會重複開始,孩子也會這樣,對吧? –

+0

@TheCakeWasALie如果我正確地獲得了您的描述,它可以工作,如果您的Web應用程序作爲孩子啓動後臺進程,然後將傳入的消息傳遞給它。 – ThomasH

+0

我想這裏是沒有辦法,我可以保持Web應用程序和我的主要腳本之間的連接,至少我被告知。我只能將命令發送到通過專用協議連接的設備。在我的設備(一個RPi)上,我可以定義一個腳本,一接到命令就立即開始。當我發送另一個命令時,腳本再次啓動。所以每當我改變位置時,我的腳本的一個新實例就會開始。所以我需要我的主腳本在後臺運行,控制步進器和某種「控制」腳本,只是傳遞一個數字/字符串,然後退出。 –

相關問題