2010-07-17 74 views
7
輸入

一個Python腳本我需要運行需要輸入僅作爲命令行參數傳遞的文件,像這樣:強制python腳本採取從STDIN

$ markdown.py input_file 

有什麼辦法得到它接受來自STDIN的輸入?我希望能夠通過猛砸做到這一點,沒有顯著修改python腳本:

$ echo "Some text here" | markdown.py 

如果我必須修改Python腳本,我將如何做呢?

(編輯:Here是解析命令行選項的腳本。)

回答

11

我不知道它是多麼便攜,但在Unix-Y系統可以命名爲/dev/stdin文件:

$ echo -n hi there | wc /dev/stdin 
     0  2  8 /dev/stdin 
+0

謝謝!這正是我所期待的。 – Karthik 2010-07-17 20:15:15

4

確認這是接近文件的頂部:

import sys 

然後尋找這樣的事情:

filename = sys.argv[1] 
f = open(filename) 

,並用此替代它:

f = sys.stdin 

如果沒有看到您開始使用的腳本,很難更具體。

+0

[這裏]( http://codaset.com/repo/python-markdown/source/master/blob/067d88bc41c7924c9087b724ff5247235243ce6b/markdown/commandline.py)是該文件。它使用optparse模塊,所以沒有sys.argv []。 – Karthik 2010-07-17 20:09:51

0

在代碼中,你有這樣的一行:

if not len(args) == 1: 

你可以做的是檢查你是否沒有文件名,而是使用「/ dev/stdin」(在允許它的系統上)。

另一個解決方案是隻需更換:

if not len(args) == 1: 
    parser.print_help() 
    return None, None 
else: 
    input_file = args[0] 

if not len(args) == 1: 
    input_file = sys.stdin 
else: 
    input_file = open(args[0]) 

這當然意味着返回「INPUT_FILE」的不再是一個文件名,但一個文件對象,這意味着進一步調用函數中的修改。

第一個解決方案是更少的修改,但更多的平臺特定,第二個更多的工作,但應該在更多的系統上工作。

0

我從你提出的關於Python-Markdown的問題的細節猜測,所以我追溯了源代碼中的相關行:做到這一點Daniel的方式,在markdown/__init__.py的第443行,你要替換

input_file = codecs.open(input, mode="r", encoding=encoding) 

input_file = codecs.EncodedFile(sys.stdin, encoding) 

雖然那麼你就無法真正事後處理文件,所以對於一個更普遍有用的黑客,你可以把一個條件:

if input: 
    input_file = codecs.open(input, mode="r", encoding=encoding) 
else: 
    input_file = codecs.EncodedFile(sys.stdin, encoding) 

,然後你不得不調整markdown/commandline.py無法退出,如果它沒有給出一個文件名:變線72-73

parser.print_help() 
return None, None 

input_file = None 

的一點是,這不是一件簡單的事情。在這一點上我會用一個特殊的文件像馬克那樣Rushakoff建議,如果他不打我給它;-)

0

我建議去這裏:

http://codaset.com/repo/python-markdown/tickets/new

和提交請求他們添加該功能。對他們來說應該是直截了當的,所以他們可能願意繼續做下去。

+0

該網站看起來有點死,我認爲這可能是一個更富有成效的想法,去他們的[Gitorious項目](http://gitorious.org/python-markdown),在分支實施更改,並要求它被納入該項目。 – 2010-07-17 20:26:09

0

在bash,還可以使用process substitution

markdown.py <(echo "Some text here") 

對於單個輸入的/ dev /標準輸入工程,但進程替換也適用於若干輸入(甚至輸出)