2012-03-28 82 views
2

假設我想從rsgen.py的輸出被用作我的simulate.py腳本的references參數。我該怎麼做?Python argparse和Unix管道參數

simulate.py

parser.add_argument("references", metavar="RS", type=int, nargs="+", help="Reference string to use") 

我試圖

# ./simulate.py references < rs.txt 
usage: simulate.py [-h] [--numFrames F] [--numPages P] RS [RS ...] 
simulate.py: error: argument RS: invalid int value: 'references' 

# ./simulate.py < rs.txt 
usage: simulate.py [-h] [--numFrames F] [--numPages P] RS [RS ...] 
simulate.py: error: too few arguments 

我相信我的管道語法錯了,我該如何解決呢?

Idealy,我想直接管道輸出從rsgen.pysimulate.py

回答

3

如果你的意思是你想使用rsgen.py的輸出作爲命令行參數simulate.py,使用後引號的references參數,它運行所包含的命令和輸出放入命令行

./simulate.py `./rsgen.py` 
+0

另一種語法是$ ./simulate.py $(rsgen.py)由恕我直言./rsgen.py $ | ./simulate.py更好。 – 2012-03-28 07:46:20

+1

這是用於將程序輸出轉換爲命令行參數的最簡單且得到最廣泛支持的shell語法。您不必擔心嵌套或其他任何與您的用例有關的事情。但是,如果rsgen的輸出非常巨大,請不要使用它:在這種情況下,使用管道並從標準輸入讀取simulate.py。 – alexis 2012-03-28 12:44:36

3

如果你需要給的rsgen.py輸出作爲參數,最好的解決方法是使用command substitution。語法根據您正在使用的外殼不同,但下面將上最先進的殼工作:

./simulate.py references $(./rsgen.py) 

側面說明,布賴恩·斯威夫特的回答是反向引號的命令替換。該語法在大多數shell中也是有效的,但是它的缺點是不能很好地嵌套。

a.py

print "hello world" 

在另一方面,如果你想管腳本到另一個的輸出,你應該從sys.stdin

讀取示例b.py

import sys 

for i in sys.stdin: 
    print "b", i 

結果

$ ./a.py | ./b.py 
b hello world