python 與子進程通信

本文出發點

我個人需求是:
在一個py文件裏,想獲得另一個 py文件某函數的輸出。
(當然,直接 import 該函數,調用不就行了嗎 ! )
(擴展,子進程沒有限制,任意可執行文件皆可 )

詳細例子

假設現在 A 裏面有一個循環:

  • 獲取用戶輸入
  • 調用 B 中 函數
  • 返回值到 A 程序

A 主程序

import os
from subprocess import PIPE, Popen

# 這幾行是獲取 子程序 可執行文件的位置,沒有啥意義
cur_file = os.path.realpath(__file__)
cur_path = os.path.dirname(cur_file)
exec_file = cur_path + '/' + 'B.py'
# 假設目的程序是 B.py
# 注意:代碼在 Unix 類操作系統上正常,對於 Windows 不知道,可能結果錯誤

# 下面這行是創建子進程,在終端裏就是 python B.py。 輸入輸出是管道。
p = Popen("python " + exec_file, shell=True, stdout=PIPE, stdin=PIPE)

# 假設下面是程序裏用戶交互部分:
while True:
	some_str = "可能是用戶輸的字符串,作爲標準輸入。\n"
	# 注意結尾一定要有換行符,因爲標準輸入是通過換行符結束的
	# 因此弊端就是 如果輸入中就有換行符,需要自己處理,比如
	# 替換爲 ||換行||,再在子程序裏處理
	
	# 轉 utf8
    p.stdin.write(bytes(some_str, encoding='utf8'))
	p.stdin.flush()
	# 至此,some_str 已經被傳輸到了 B 的標準輸入流
	# 參照下面 B.py 看
    out_bytes = p.stdout.readline()
	# 至此,B 的標準輸出流的一行 被讀到 out_bytes
	
    print(str(out_bytes, encoding='utf8'))
    
    import time
    time.sleep(1)

B 子程序

子程序可以是任意可執行文件,這裏還是 py

import sys

while True:
	# 這裏的 txt,就是 A write 的數據,標準輸入
    txt = input()
    
    # 這裏是業務處理
    v = txt + ' from B'
    
    # 標準輸出,在別的可執行程序裏可能是 echo 等,結果都流到了 A 中
    print(v)
    sys.stdout.flush()
   
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章