一個Python腳本我需要運行需要輸入僅作爲命令行參數傳遞的文件,像這樣:強制python腳本採取從STDIN
$ markdown.py input_file
有什麼辦法得到它接受來自STDIN的輸入?我希望能夠通過猛砸做到這一點,沒有顯著修改python腳本:
$ echo "Some text here" | markdown.py
如果我必須修改Python腳本,我將如何做呢?
(編輯:Here是解析命令行選項的腳本。)
一個Python腳本我需要運行需要輸入僅作爲命令行參數傳遞的文件,像這樣:強制python腳本採取從STDIN
$ markdown.py input_file
有什麼辦法得到它接受來自STDIN的輸入?我希望能夠通過猛砸做到這一點,沒有顯著修改python腳本:
$ echo "Some text here" | markdown.py
如果我必須修改Python腳本,我將如何做呢?
(編輯:Here是解析命令行選項的腳本。)
我不知道它是多麼便攜,但在Unix-Y系統可以命名爲/dev/stdin
文件:
$ echo -n hi there | wc /dev/stdin
0 2 8 /dev/stdin
確認這是接近文件的頂部:
import sys
然後尋找這樣的事情:
filename = sys.argv[1]
f = open(filename)
,並用此替代它:
f = sys.stdin
如果沒有看到您開始使用的腳本,很難更具體。
[這裏]( http://codaset.com/repo/python-markdown/source/master/blob/067d88bc41c7924c9087b724ff5247235243ce6b/markdown/commandline.py)是該文件。它使用optparse模塊,所以沒有sys.argv []。 – Karthik 2010-07-17 20:09:51
在代碼中,你有這樣的一行:
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」的不再是一個文件名,但一個文件對象,這意味着進一步調用函數中的修改。
第一個解決方案是更少的修改,但更多的平臺特定,第二個更多的工作,但應該在更多的系統上工作。
我從你提出的關於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建議,如果他不打我給它;-)
我建議去這裏:
http://codaset.com/repo/python-markdown/tickets/new
和提交請求他們添加該功能。對他們來說應該是直截了當的,所以他們可能願意繼續做下去。
該網站看起來有點死,我認爲這可能是一個更富有成效的想法,去他們的[Gitorious項目](http://gitorious.org/python-markdown),在分支實施更改,並要求它被納入該項目。 – 2010-07-17 20:26:09
在bash,還可以使用process substitution:
markdown.py <(echo "Some text here")
對於單個輸入的/ dev /標準輸入工程,但進程替換也適用於若干輸入(甚至輸出)
謝謝!這正是我所期待的。 – Karthik 2010-07-17 20:15:15