本文出發點
我個人需求是:
在一個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()