2017-06-27 53 views
2

我正試圖找到最簡單的方法來從一個腳本共享實時變量到另一個腳本。第一個腳本將讀取seonsor數據,其他腳本將根據第一個腳本的實時數據進行計算。我想分開跑他們。我希望能夠殺死第二個腳本並再次運行,而不會有任何問題。Python - 如何與另一個腳本共享實時數據

我想有第二個腳本來打印實時數據,只要它啓動。


更新:

我已經finaly得到了一些時間os.pipe玩()。我設法運行了一些使用os.fork()的腳本,但是當我試圖將一個腳本分成兩個單獨的程序時,我開始遇到一些問題。

計劃我已經initated並工作:

#!/usr/bin/python 
    import os, sys 
    r, w = os.pipe() 
    processid = os.fork() 
    if processid: 
      os.close(w) 
      r = os.fdopen(r) 
      print("Parent reading") 
      str = r.read() 
      print("text =", str) 
      sys.exit(0) 
    else: 
      os.close(r) 
      w = os.fdopen(w, 'w') 
      print("Child writing") 
      w.write("Text written by child...") 
      w.close() 
      print("Child closing") 
      sys.exit(0) 

基於該腳本我試着寫我自己單獨的腳本。

第一個腳本,打印時間管:

#!/usr/bin/python 
    import os, sys, time 
    stdout = sys.stdout.fileno() 
    r, w = os.pipe() 
    #os.close(r) 
    w = os.fdopen(w, 'w') 
    i = 0 
    while i < 1000: 
     i = i + 1 
     w.write('i' + " ") 
     time.sleep(1) 

第二個腳本,從管道中讀取時間:

#!/usr/bin/python 

    import os, sys, time 
    r, w = os.pipe() 
    r = os.fdopen(r) 
    str = r.read() 
    print(str) 

當我嘗試運行我的劇本沒有任何反應。任何建議我做錯了什麼?也許我錯過了關於標準輸入輸出和os.pipe()的一些細節?

+0

最簡單的機制是使用文件系統。將script1附加到文本文件。然後讓script2輪詢新行。 – user590028

+0

...或使用命名管道。使用文件或管道,請注意緩衝。 – cdarke

+0

我認爲管道是我一直在尋找的東西。我需要現在瞭解它的工作原理。謝謝! –

回答

0

編輯:只是爲了說明一個可能的毒丸方法的一個粗略的例子。不幸的是,python的(多)隊列沒有實現peek電話,所以我用一個第二隊列:

編劇:

import time 
import sys 

def write(queue_msg, queue_term): 
    i = 0 
    sys.stdout = open("writer" + ".out", "w") 
    sys.stderr = open("writer_err" + ".out", "w") 
    stop_writing = True 
    while i<1000: 
     if not(stop_writing): 
      print("Writer at iteration ", i) 
      queue_msg.put("Iteration " + str(i)) # put a value inside the queue 
      i += 1 
     time.sleep(1) 
     q_term_val = queue_term.get() if not(queue_term.empty()) else "CONTINUE" #Check that the queue is not empty otherwise put a non important value 
     print(q_term_val) 
     if q_term_val == "START": 
      print("Start working") 
      stop_writing = False 
     elif q_term_val == "STOP": 
      print("Stop working") 
      stop_writing = True 
     sys.stderr.flush() #flush stdout and stderr to disk 
     sys.stdout.flush() 

讀者:

import time 
import sys 

def read(queue_msg, queue_term): 
    sys.stdout = open("reader" + ".out", "w") #redirect process stdout to file "reader.out" 
    sys.stderr = open("reader_err" + ".out", "w") 
    queue_term.put("START") 
    while True: 
     value = queue_msg.get() 
     print(value) # write value to reader.out filer as mentioned above 
     if int(value.split(" ")[1]) > 10: 
      print("Stop working, I am tired...") 
      queue_term.put("STOP") 
      time.sleep(5) #wait 5 seconds before sending start to the worker 
      queue_term.put("START") 
     time.sleep(1) 
     sys.stderr.flush() 
     sys.stdout.flush() 

主營:

import reader 
import writer 
import multiprocessing as mp 

def main(): 

    q_msg = mp.Queue() 
    q_term = mp.Queue() 
    r = mp.Process(target=reader.read, args=(q_msg, q_term,)) 
    w = mp.Process(target=writer.write, args=(q_msg, q_term,)) 
    r.start() 
    w.start() 
    print("Processes started, check that in your folder there are a reader.out and a writer.out files") 

if __name__ == "__main__": # "workaround" needed on Windows 
    main() 

你應該在你的fol中有reader.out文件(也是writer.out)如果讀者確實讀取了作者在「writer.out」中寫入隊列的值,則可以看到當他收到毒丸時,作者停止寫入隊列。在time.sleep(5)調用之後的閱讀器從正確的位置重新開始。

+0

@asettourf謝謝你的幫助。有一件事我缺少。它是共享數據,但它是隊列。如果我用time.sleep(3)延遲閱讀器腳本,那麼它不會打印實時數據,而是排隊等待的數據。 –

+0

@ŁukaszŻurek我不確定我是否理解你的評論,如果你想要實時的話,用Python和大多數操作系統很難實現。現在,如果您擔心'time.sleep'調用,您可以刪除它們,腳本仍然有效,它們不會在每個循環之間等待。 – Adonis

+0

我剛纔提到過。我想運行一個腳本來計算時間,第二個腳本讀取當前時間 - 即使我關閉並再次運行第二個腳本。你的例子將打印隊列中的每個值。當我改變'time.sleep(3)'時,我希望得到時間:1,4,7,10,...。 –

相關問題