【问题标题】:Python: pass arguments to a scriptPython:将参数传递给脚本
【发布时间】:2014-04-05 01:19:04
【问题描述】:

我有一个工作代码可以从 csv 列中打印随机行。

#!/usr/bin/python

import csv   

import random 

**col**=2

with open('<filename>','r') as f:
        reader=csv.reader(f)
        data=[row[col] for row in reader]
    from random import shuffle
    shuffle(data)
    print '\n'.join(data[:**100**])
    f.close();

我想参数化这个脚本。通过传递 , position (col) & sample (e.g. 100 values)

我找不到合适的教程来解释这一点。有什么想法吗?

【问题讨论】:

标签: python csv parameters command-line-arguments


【解决方案1】:

您可以像这样使用 sys 模块将命令行参数传递给您的 python 脚本。

import sys

name_of_script = sys.argv[0]
position = sys.argv[1]
sample = sys.argv[2]

然后你的命令行将是......

./myscript.py 10 100

【讨论】:

  • 感谢基因组。有没有办法在这个中加入解析或错误处理?
  • 没问题。 Alecxe 为更强大的命令行参数处理提供了一个极好的选项。
【解决方案2】:

使用argparse模块:

argparse 模块使编写用户友好的命令行变得容易 接口。该程序定义了它需要的参数,以及 argparse 将弄清楚如何从 sys.argv 中解析出来。这 argparse 模块还自动生成帮助和使用信息 并在用户给程序无效参数时发出错误。

它非常强大:您可以指定帮助消息、进行验证、提供默认值……无论您能想象到如何使用命令行参数。

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("-p", "--position", type=int)
parser.add_argument("-s", "--sample", type=int)

args = parser.parse_args()
col = args.position
sample = args.sample

print col
print sample

这是命令行上的内容:

$ python test.py --help
usage: test.py [-h] [-p POSITION] [-s SAMPLE]

optional arguments:
  -h, --help            show this help message and exit
  -p POSITION, --position POSITION
  -s SAMPLE, --sample SAMPLE

$ python test.py -p 10 -s 100
10
100
$ python test.py --position 10 --sample 100
10
100

谈谈您提供的代码:

  • 未使用的import random 声明
  • from random import shuffle 移到脚本顶部
  • 无需调用f.close()(尤其是;)-with 处理自动关闭文件

修复后的代码如下所示:

#!/usr/bin/python
import argparse
import csv
from random import shuffle


parser = argparse.ArgumentParser()
parser.add_argument("-p", "--position", type=int)
parser.add_argument("-s", "--sample", type=int)

args = parser.parse_args()

with open('<filename>', 'r') as f:
    reader = csv.reader(f)
    data = [row[args.position] for row in reader]
    shuffle(data)
    print '\n'.join(data[:args.sample])

【讨论】:

  • 谢谢alecxe。不幸的是 2.6.6 没有 argparse 模块。还有其他我喜欢这种存储和解析变量的方式吗?
  • @sumoka 当然,从 PyPi 安装它:*.com/questions/15330175/…
【解决方案3】:

谢谢各位。

由于缺少权限,我无法安装 argaprse - 同时。

这是解决方案-

#!/usr/bin/python

import csv   # This will help us reading csv formated files.
import sys
import optparse #import optparse

from random import shuffle

parser=optparse.OptionParser()

# import options

parser.add_option('-f','--filename',help='Pass the csv filename')
parser.add_option('-p','--position',help='column position in the file',type=int)
parser.add_option('-s','--sample',help='sample size',type=int)

(opts,args) = parser.parse_args() # instantiate parser


# Program to select random values

with open('<filepath>'+opts.filename,'r') as f:
        reader=csv.reader(f)
        data=[row[opts.position] for row in reader]

        shuffle(data)

        #print '\n'.join(data[:opts.sample])

# create o/p file
file=open("<opfilename>.txt","w")
file.write('\n'.join(data[:opts.sample]))
file.close()

【讨论】: