【问题标题】:Python argparse & Unix piping to argumentsPython argparse 和 Unix 管道到参数
【发布时间】:2012-04-11 18:35:41
【问题描述】:

假设我希望rsgen.py 的输出用作我的simulate.py 脚本的references 参数。我该怎么做?

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

我认为我的管道语法有误,我该如何解决?

理想情况下,我想直接将rsgen.py 的输出通过管道传输到simulate.pyreferences 参数中

【问题讨论】:

    标签: python unix pipe command-line-arguments argparse


    【解决方案1】:

    如果您想使用 rsgen.py 的输出作为命令行参数来模拟.py,请使用反引号来运行包含的命令并将输出放入命令行

        ./simulate.py `./rsgen.py`
    

    【讨论】:

    • 另一种语法是 $ ./simulate.py $(rsgen.py) by imho $ ./rsgen.py | ./simulate.py 更好。
    • 这是将程序输出转换为命令行参数的最简单和最广泛支持的 shell 语法。您无需担心用例的嵌套或其他任何事情。但是,如果 rsgen 的输出真的很大,请不要使用它:在这种情况下,请使用管道并从 stdin 读取模拟.py。
    【解决方案2】:

    如果您需要将rsgen.py 的输出作为参数,您最好的解决方案是使用command substitution。语法因您使用的 shell 而异,但以下内容适用于大多数现代 shell:

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

    旁注,Brian Swift 的回答使用反引号进行命令替换。该语法在大多数 shell 上也有效,但缺点是嵌套不好。

    另一方面,如果你想将一个脚本的输出通过管道传输到另一个,你应该阅读sys.stdin

    例子:

    a.py

    print "hello world"
    

    b.py

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

    结果

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

    【讨论】:

    • 在python 3中看起来像这样import sys [NEWLINE] for line in sys.stdin: [NEWLINE] print("###", line)
    猜你喜欢
    • 1970-01-01
    • 2013-08-15
    • 2020-04-11
    • 2021-03-06
    • 2012-04-16
    • 2018-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多