簡體   English   中英

如何在 Python 中“捕獲”程序的 stdin、stdout、stderr?

[英]How to 'catch' stdin, stdout, stderr of a program in Python?

我有一個sql.exe ,它有一個命令行界面,將 sql 查詢作為輸入並打印結果。 我需要用 Python 編寫一個程序,它將生成 sql 命令,將它們作為輸入傳遞給該程序並讀取輸出。

為了練習,我用 python 編寫了一個玩具程序adder.py

if __name__ == '__main__':
    while True:
        try:
            line = input()
            a, b = line.strip().split()
            c = int(a) + int(b)
            print(c)
        except EOFError:
            exit()
        except:
            continue

我創建了一個in.txt文件:

10 5
7 3
1 a
2 1

我從 cmd 執行: -$ python adder.py < in.txt > out.txt並且 out.txt 是:

15
10
3

我的問題是,如何流式傳輸/緩沖輸入和輸出,以不斷與程序通信,而不必一次又一次地創建和讀取文件?

在代碼中使用 bash 管道和兩個不同的函數

嘗試用這種方法重新思考你的程序。

./mycode.py -gen | sqlite3 | ./mycode.py -proc
  1. 您的程序將接受一個用於選擇行為的命令行參數
    (從 SQL 生成輸入或處理輸出)

  2. 人物| 是 Bash 中的管道操作數

  3. 處理 SQL 輸出的函數必須讀取stdin

命令行參數

您必須閱讀並驗證命令行參數並選擇執行兩個不同的函數。
請參閱此處如何讀取/處理命令行參數?

Bash 管道

關於 bash 中的管道

command1 | command2

command1的標准輸出通過管道連接到command2的標准輸入。
示例: echo "my password" | shasum -a 256 echo "my password" | shasum -a 256

從標准輸入讀取

請參閱此處有關如何讀取標准輸入的幾個示例您如何從標准輸入讀取?

示例代碼

請參閱此處的示例代碼。 下面是一個示例輸出(在 macOS 和 Ubunto 中使用 SQLite 測試):

> ./mycode.py -gen
SELECT 0 + 0;
SELECT 1 + 2;
SELECT 2 + 4;
...

> ./mycode.py -gen | sqlite3
0
3
6
...

> # ./mycode.py -proc multiply by 10 the stdin
> ./mycode.py -gen | sqlite3 | ./mycode.py -proc
0
30
60
...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM