Python脚本的可变参数数

Python脚本的可变参数数,python,input,Python,Input,运行Python脚本的命令行是: ./parse_ms.py inputfile 3 2 2 2 参数是一个输入,数字3是我研究的样本数量,每个样本有2个人 在脚本中,我指出如下参数: inputfile = open(sys.argv[1], "r") nsam = int(sys.argv[2]) nind1 = int(sys.argv[3]) nind2 = int(sys.argv[4]) nind3 = int(sys.argv[5]) 但是,样本数量可能会有所不同。我可以:

运行Python脚本的命令行是:

./parse_ms.py inputfile 3 2 2 2 
参数是一个输入,数字3是我研究的样本数量,每个样本有2个人

在脚本中,我指出如下参数:

inputfile = open(sys.argv[1], "r")
nsam = int(sys.argv[2])
nind1 = int(sys.argv[3])
nind2 = int(sys.argv[4])
nind3 = int(sys.argv[5])
但是,样本数量可能会有所不同。我可以:

./parse_ms.py input 4 6 8 2 20
在本例中,我有4个样本,每个样本中有6个、8个、2个和20个个体

添加另一个
sys.argv
示例中添加的所有内容似乎效率低下。有没有办法让这更一般化?也就是说,如果我将
nsam
写为等于5,那么Python会自动为每个样本中的个体添加五个数字。

您只需将其余的
sys.argv
放到一个列表中即可。e、 g

inputfile = open(sys.argv[1], "r")
num_samples = int(sys.argv[2])
samples = sys.argv[3:3+num_samples]
尽管这就是你的全部论点,但你不能简单地传递大量的样本,而只是抓住所有的东西

inputfile = open(sys.argv[1], "r")
samples = sys.argv[2:]
之后可以将样本转换为适当的数据类型

另外,请查看处理命令行参数的更好方法。

您只需将sys.argv的其余部分放到一个列表中即可。e、 g

inputfile = open(sys.argv[1], "r")
num_samples = int(sys.argv[2])
samples = sys.argv[3:3+num_samples]
尽管这就是你的全部论点,但你不能简单地传递大量的样本,而只是抓住所有的东西

inputfile = open(sys.argv[1], "r")
samples = sys.argv[2:]
之后可以将样本转换为适当的数据类型


另外,请查看处理命令行参数的更好方法。

您可以有一个NIND列表,甚至可以捕获执行以下操作的期望值

try:
    ninds = [int(argv[i+3]) for i in range(int(argv[2]))]
except IndexError:
    print("Error. Expected %s samples and got %d" %(argv[2], len(argv[3:])))

您可以有一个nind列表,甚至可以捕获执行以下操作的期望值

try:
    ninds = [int(argv[i+3]) for i in range(int(argv[2]))]
except IndexError:
    print("Error. Expected %s samples and got %d" %(argv[2], len(argv[3:])))

samples=sys.argv[3:]
?或者改用
argparse
解析标志。或者对组或包含在
中的数字使用
shlex.split
len(sys.arvg)
提供输入列表的长度(+1表示可执行名称),因此您可以跳过第一个参数,并可以使用带有任意数量参数列表的for循环。有一些库可以帮助您进行参数分析。@Torxed我们如何在这种情况下使用argparse请?
samples=sys.argv[3:]
?或者使用
argparse
来解析标志。或者对包含在
中的组或数字使用
shlex.split
len(sys.arvg)
提供输入列表的长度(+1表示可执行文件名),因此可以跳过第一个参数,并可以使用for循环和任意数量的参数列表。有一些库可以帮助您进行参数解析。@Torxed我们如何才能在这种情况下使用argparse?Op也希望将示例转换为int。除此之外,非常好。Op也希望将样本转换为整数。除此之外,非常好。刚刚更新了代码。现在它起作用了。如果他需要的样本大小为int,则应使
ninds=[int(argv[i+3])…]
alsoI已删除我的否决票。这有点尴尬,但完全是功能性的。不过Op确实需要
int(argv[i+3])
。只是更新了代码。现在它起作用了。如果他需要的样本大小为int,则应使
ninds=[int(argv[i+3])…]
alsoI已删除我的否决票。这有点尴尬,但完全是功能性的。Op确实想要
int(argv[i+3])