管道python函数的结果

时间:2016-10-17 14:50:01

标签: python function stdout piping

我有返回一些结果的函数。我想将这些函数作为库访问:它们将被导入并用于一些较大的脚本中。这很简单。但是,我想将这些函数用作单独的脚本,将结果输出到stdout以用于管道目的。以这种方式编写我的函数是否有意义?

def myfunction(params=(), to_stdout=False): 
  result = whatever_i_want_to_process(params)
  if to_stdout is True:
    sys.stdout.writelines(result)
  return result

还是有更好,更有效,更直观的方式来做我想做的事吗?

编辑1

更具体地说,每个函数都接受一个原始输入(来自stdin或原始字符串),并为其添加内容:

def add_name(content, to_stdout=False): 
    result = content + "\nadded name"
    if to_stdout is True:
        sys.stdout.writelines(result)
    return result

def add_surname(content, to_stdout=False): 
    result = content + "\nadded surname"
    if to_stdout is True:
        sys.stdout.writelines(result)
    return result

def add_name_and_surname(content, to_stdout=False):
    result = add_surname(add_name(content))
    if to_stdout is True:
        sys.stdout.writelines(result)
    return result

所以我想把这两个第一个函数用作库,没有什么可以改变的,但是我也希望能够将这两个函数称为shell脚本,结果可以用管道传输:

$ echo "Here is my content" | add_name

有没有可行的方法呢?首先测试to_stdout变量是否有意义,还是容易出错且效率低下?

我也在考虑使用click库轻松地从函数构建命令。

编辑2

使用click库,函数如下所示:

import click
import os, sys

@click.command()
@click.argument('content', required=False)
@click.option('--to_stdout', default=True)
def add_name(content, to_stdout=False):
    if not content:
        content = ''.join(sys.stdin.readlines())
    result = content + "\n\tadded name"
    if to_stdout is True:
        sys.stdout.writelines(result)
    return result


@click.command()
@click.argument('content', required=False)
@click.option('--to_stdout', default=True)
def add_surname(content, to_stdout=False):
    if not content:
        content = ''.join(sys.stdin.readlines())
    result = content + "\n\tadded surname"
    if to_stdout is True:
        sys.stdout.writelines(result)
    return result

@click.command()
@click.argument('content', required=False)
@click.option('--to_stdout', default=False)
def add_name_and_surname(content, to_stdout=False):
    result = add_surname(add_name(content))
    if to_stdout is True:
        sys.stdout.writelines(result)
    return result

这样我就可以使用setup.py文件和pip install --editable .生成三个命令“add_name”,“add_surname”和“add_name_and_surname”然后我能够管道:

$ echo "original content" | add_name | add_surname 
original content

    added name
    added surname

然而,当使用不同的click命令作为函数进行编写时,我需要解决一个小问题:

$echo "original content" | add_name_and_surname 
Usage: add_name_and_surname [OPTIONS] [CONTENT]

Error: Got unexpected extra arguments (r i g i n a l   c o n t e n t 
)

我不知道为什么会得到那个结果。

0 个答案:

没有答案