2016-06-15 257 views
1

例如:如何將輸出從一個python腳本輸入到另一個python腳本?

甲script1.py從用戶得到的綴表達式並將其轉換爲一個後綴表達式並返回它或它打印到stdout

script2.py獲取從stdin和計算一個後綴表達式它與輸出值

我想要做這樣的事情:

python3 script1.py | python3 script2.py 

這不工作,雖然,你可以點我在正確的方向,我怎麼能做到這一點?

編輯 -

這裏有一些關於什麼「不起作用」的更多細節。

當我執行python3 script1.py | python3 script2.py 終端要求我輸入script2.py程序,當它應該爲script1.py程序請求輸入並將其重定向爲script2.py的輸入。

因此,當它詢問「輸入中綴表達式:」並將其重定向到後綴腳本時,它會要求我輸入後綴表達式:。

+0

如果您將它們作爲函數並按順序調用,會出現什麼問題。你的方式應該順便工作,問題必須是你的序列化。 – HuStmpHrrr

+1

該命令行應完全按照您的說法進行操作。它如何不能達到你的期望,*正是*? (「它不工作」是一個完全無信息的問題報告。) – rici

+0

沒有什麼是錯誤的,我將腳本定義爲兩個獨立的函數並按順序調用它們,但我想學習如何以這種方式進行操作。至於de/serialization,你能詳細說明一下嗎? – 7alman

回答

0

如果我正確地解決了您的問題,那麼您的兩個腳本都會寫出提示輸入。例如,他們可能都是這樣的:

in_string = input("Enter something") 
print(some_function(in_string)) 

哪裏some_function是具有根據輸入的字符串(這可能是每個腳本不同)不同的輸出功能。

問題是當一個腳本的輸出被傳送到另一個腳本時,"Enter something"提示不會正確顯示給用戶。這是因爲提示符被寫入標準輸出,所以第一個腳本的提示被傳送到第二個腳本,而第二個腳本的提示被顯示。這是誤導,因爲它是第一個將(直接)從用戶接收輸入的腳本。提示文字也可能會混淆兩個腳本之間傳遞的數據。

這個問題沒有完美的解決方案。一個部分的解決方案是將提示寫入標準錯誤,而不是標準輸出。這樣可以讓你看到兩個提示(儘管你只能實際響應其中一個提示)。我不認爲你可以直接做到這一點與input,但如果你想print可以到其他文件流的寫:print("prompt", file=sys.stderr)

另一種部分解決方案是檢查你的輸入和輸出流,並跳過打印提示,如果任何一個不是「tty」(終端)。在Python中,你可以做sys.stdin.isatty()。如果許多命令行程序直接連接到用戶而不是管道或文件,則它們具有不同的「交互模式」。

如果管道輸出是您的程序的主要功能,您可能不想使用提示!許多標準的Unix命令行程序(如catgrep)根本沒有任何交互行爲。它們要求用戶傳遞命令行參數或設置環境變量來控制它們的運行方式。即使他們無法訪問標準輸入和標準輸出,也可以讓他們按預期工作。

0

例如,如果你有nginx的運行和script1.py:

import os 

os.system("ps aux") 

和script2.py

import os 

os.system("grep nginx") 

然後運行:

python script1.py | script2.py 

將同

ps aux | grep nginx 
0

完成的緣故,並提供使用os模塊的替代:

fileinput模塊負責管道的你,並運行一個簡單的測試,我相信它會使其成爲一種易於實現。

爲了使您的文件,以支持管道輸入,只要做到這一點:

import fileinput 
with fileinput.input() as f_input: # This gets the piped data for you 
    for line in f_input: 
     # do stuff with line of piped data 

所有你必須做的就是:

$ some_textfile.txt | ./myscript.py 

注意的FileInput也使數據輸入您的腳本像這樣: $ ./myscript.py some_textfile.txt $ ./myscript.py < some_textfile.txt

氏作品與Python的打印輸出一樣容易:

>test.py # This prints the contents of some_textfile.txt 
with open('some_textfile.txt', 'r') as f: 
    for line in f: 
     print(line) 

$ ./test.py | ./myscript.py 

當然,不要在你的腳本的頂部忘記hashbang #!/usr/bin/env python對這種方式進行工作。

該配方的特色Beazley & Jones's Python Cookbook - 我全心全意推薦它。

相關問題