管道 bash 到特定的 python 标志

Posted

技术标签:

【中文标题】管道 bash 到特定的 python 标志【英文标题】:Pipe bash to a specific python flag 【发布时间】:2022-01-10 14:48:01 【问题描述】:

我正在用 python 编写一个程序来搜索我的 .bib 文件以查找带有多个标志的 LaTeX。为此,我正在为 python 使用argparse 包。

parser = argparse.ArgumentParser(description=description_string, usage=usage_string, add_help=True)
parser.add_argument("-f", "--file", type=str, help=file_help_text)
parser.add_argument("-s", "--signifier", type=str, action='append',help=signifier_help_text)
parser.add_argument("-a", "--attribute", type=str, help=attribute_help_text)
parser.add_argument("-q", "--query", type=str, help=query_help_text)
args = parser.parse_args()

由于我希望能够在终端中使用该程序,因此希望能够将信息从其他进程传送到脚本。具体来说,我希望将任何通过管道传输到脚本的字符串用作我脚本的 -q / --query 选项的输入。

我已经阅读了以下问题,但它并没有解决我的问题: Bash pipe to python

如何控制管道字符串的输入标志?有配套吗?如果我能插入它,它真的会让我的脚本更有用。

【问题讨论】:

如果你想通过管道传输它们,我认为你必须编写自己的解析器......你也可以使用./my_script.py --some param --query $( my_bash_script ) ... 嗯,这有点笨拙,但如果我在参数周围加上“”,它就可以了。谢谢!我会看看,如果一个解析器值得付出努力。 argparse 解析 sys.argv。管道数据从sys.stdin 读取,如链接所示。这些是不同的来源。 【参考方案1】:

您可以让argparsesys.argv 以外的其他地方获取输入。也许首先检查是否有标准输入。如果没有,请准备参数列表arglist 等于sys.argv 或其有用部分。如果是,则将其设为sys.argv,并附加从标准输入读取的 1 行。

import sys

arglist = sys.argv[1:]
if not sys.stdin.isatty():
    query = sys.stdin.read(1)
    arglist.append(query) #or perhaps "--query "+query

最后,像往常一样解析它,但使用arglist作为参数:

args = parser.parse_args(arglist)

【讨论】:

以上是关于管道 bash 到特定的 python 标志的主要内容,如果未能解决你的问题,请参考以下文章

在 Xcode 中使用 bash 编译标志

通过回声管道将python变量(字符串)传递给bash命令[重复]

Microsoft azure devops python 管道失败,Bash 以代码“5”退出

Bash 排序类似于 Windows 的“自然排序顺序”

管道输出到 bash 命令的中间

Bash 将 stdio 重定向到命名管道