0

全て、

書こうとしている個人的なスクリプトがあり、小さな問題に遭遇しました。問題は、引数がどこにあっても「-s」引数をサポートできるようにしたいということです。また、その議論が複数回許可されることを望みます。例えば:

script.py 最初の引数 2 番目の引数 -s 3 番目の引数 -s 4 番目 5 番目 -s 6 番目

私が試したことはうまくいきません。私は次のことを試しました:

currentArg = 1
foldername = sys.argv[1:]
for folders in foldername:
   if "-s" in folders:
   newArg = currentArg + 1
   setType = str(sys.argv[newArg])
   function(setType)

それがしていることは、-s を引数として取り、それを関数に渡しているということです。上記で希望するのは、最初の「-s」が 4 番目の位置にあり、1 に 4 を加えてから、setType が sys.argv[5] に設定されていることです。また、引数をループし続けて「-s」を見つけて、次の引数を値として使用したいと思います。何か案は?

私が得るエラーは次のとおりです。

WindowsError: [Error 3] The system cannot find the path specified: 'c:\\-s/*.*'

-s を引数として認識し、それをフォルダーとして渡そうとしますが、フォルダーとして NEXT 引数を渡したいことに注意してください...

これを行うより良い方法はありますか?すべての「-s」を考慮する必要があります...

4

5 に答える 5

1

argparse is beautiful. Redesign your command line interface for it or write your own CLI-parser. CLI example:

args = ['firstargument', 'secondargument', '-s', 'thirdargument', '-s', 'fourth', 'fifth', '-s', 'sixth']
last_arg = None
container = []
marker = '-s'
for arg in args:
    if (arg != marker): last_arg = arg
    else: container.append(last_arg) 
print container        

Result of execute:

$python test.py
['secondargument', 'thirdargument', 'fifth']
于 2013-07-16T10:40:12.953 に答える
0

I've been using http://docopt.org/ with great satisfaction.

https://github.com/docopt/docopt

It does all the monkey work for you and you get your command line arguments structure just from writing the documentation for it...

Added benefit: your users get help for free :-)

For your specific case it will however (strongly :-)) encourage you to use certain standard conventions that you may or may not like. You for instance have the choice of positional and named parameters and docopt will put them together for you, but the named parameters typically have the following form:

--speed=20
-fmyfile.txt
于 2013-07-16T10:46:59.247 に答える
0

引数が文字列のリストよりも少し複雑になった場合は、引数を解析するための専用ライブラリを使用することをお勧めします。Docopt は優れています。サードパーティのライブラリをインストールしたくない場合は、argparse を使用してください。

ただし、自分でやりたい場合は、次のようなことを試してください。

args = sys.argv[1:]
if '-s' in args:
    i = args.index('-s')
    opt_val = args.pop(i+1)
    args.remove('-s')
folders = []
for folder in args:
    folders.append(folder)
于 2013-07-16T11:15:42.383 に答える
0

他の解決策を参照してください:

args = ['firstargument', 'secondargument', '-s', 'thirdargument', '-s', 'fourth', 'fifth', '-s', 'sixth', 'seventh']
args1 = ['firstargument', 'secondargument', '-s', 'thirdargument', '-s', 'fourth', 'fifth', '-s', 'sixth', 'seventh', '-s']

marker = "-s"
def parser(arglist):
    scraplist, result = [], []
    arglist_range = range(len(arglist))
    #Remember candidates for exclude. It's your marker and previous element.
    for arg in arglist_range:
        if arglist[arg] == marker:
            scraplist.append(arg - 1)
            scraplist.append(arg)
    #Excluding marked elements
    for arg in arglist_range:
        if (not arg in scraplist):
            result.append(arglist[arg])
    return result

print parser(args)
print parser(args1)

それを実行します:

$ python test.py 
['firstargument', 'fourth', 'sixth', 'seventh']
['firstargument', 'fourth', 'sixth']

Goog の練習は、あなたが望む結果をもたらします。例: input = ['some', 'input', 'data'] output = ['some', 'correct', 'output']

于 2013-07-17T06:24:55.557 に答える