使用 argparse 将多个 bash 数组传递给 Python

Posted

技术标签:

【中文标题】使用 argparse 将多个 bash 数组传递给 Python【英文标题】:Pass multiple bash arrays to Python using argparse 【发布时间】:2018-08-23 06:54:24 【问题描述】:

我有一个要从 bash 运行的 Python 脚本,它需要多个字符串数组/列表输入。 lorenzog 在另一个问题中的这个答案解释了如何使用一个数组来完成它,并且效果很好。但是我怎样才能传递多个数组呢?到目前为止,这是我尝试过的:

Bash 脚本:

#!/bin/bash

declare -a first=("one" "two" "three")
declare -a second=("four" "five")
declare -a third=("six")
declare -a fourth=("seven" "eight")

python argsprob.py "$first[@]" "$second[@]" "$third[@]" "$fourth[@]"

Python 脚本:

#!/usr/bin/env python3

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('first', nargs='+')
parser.add_argument('second', nargs='+')
parser.add_argument('third', nargs='+')
parser.add_argument('fourth', nargs='+')
args = parser.parse_args()

print(args.first)
print(args.second)
print(args.third)
print(args.fourth)

输出

$ bash argsprob.sh
['one', 'two', 'three', 'four', 'five']
['six']
['seven']
['eight']

期望的输出

['one','two','three']
['four','five']
['six']
['seven','eight']

你可能会说我不知道​​我在做什么。我尝试了其他使用 argparse 的方法(更多参数,不同的“nargs”等),但它们都不起作用。任何帮助表示赞赏!

【问题讨论】:

看看sys.argv。我认为您的 bash 命令将数组扩展为一长串字符串。所以argparse 不知道你原来的first 的结束位置和second 的开始位置。它为最后 3 个参数分别分配一个字符串(因为它们的 '+'),并将其余的分配给第一个。 nargs分别更改为3,2,1,2。 另一个选项是标记参数 (optionals)。然后标志('--first'等)充当数组之间的分隔符。 @hpaulj Chaginc nargs 到 3,2,1,2 有效,但是当我不知道列表有多少元素时,这会使事情变得更加困难。你说的第二种方法效果很好!谢谢!如果您回答,我可以将其标记为已解决 【参考方案1】:

与:

import argparse
import sys
print(sys.argv[1:])
parser = argparse.ArgumentParser()
parser.add_argument('--first', nargs='+')
parser.add_argument('--second', nargs='+')
parser.add_argument('--third', nargs='+')
parser.add_argument('--fourth', nargs='+')
args = parser.parse_args()
print(args)

电话:

1948:~/mypy$ python stack49282913.py --first "$first[@]" --second "$second[@]" --th "$third[@]" --fo "$fourth[@]"

['--first', 'one', 'two', 'three', '--second', 'four', 'five', '--th', 'six', '--fo', 'seven', 'eight']

Namespace(first=['one', 'two', 'three'], fourth=['seven', 'eight'], second=['four', 'five'], third=['six'])

【讨论】:

以上是关于使用 argparse 将多个 bash 数组传递给 Python的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 argparse 将列表作为命令行参数传递?

如何将数组传递给 Bash 函数?

将数组从一个 Bash 脚本传递到另一个

python argh/argparse:如何将列表作为命令行参数传递?

Bash - 如何将数组传递给函数,并在新函数中定义索引

使用 argparser 将参数传递给入口点 python 脚本