2009-04-03 10 views
5

リモートサーバーでコマンドを実行するはずの小さなプログラムを作成しています(ssh [hostname] [command]の周りにかなりダムラッパーと言う)。OptionParser - コマンドラインの最後に任意のオプションを指定する

私はそのように実行する:

./floep [command]

しかし、私は時々、特定のコマンドラインを渡す必要があります。

./floep -v [command]

ので、私はこのためにoptparse.OptionParserを使用することにしました。

./floep -v "uname -a"

をしかし、私はまた、それは私が使用したときに仕事をしたい:問題は、私は時々コマンドでも、私がしなければ正常に動作引数を、持っている、ある

./floep -v uname -a

アイデアはできるだけ早く、あります私は最初の非オプション引数を見つけました。それ以降はすべて私のコマンドの一部でなければなりません。

これは、しかし、私を与える:

Usage: floep [options] 

floep: error: no such option: -a

はこの構文をサポートしてはOptionParserしていますか?もしそうなら:どのように? そうでない場合は、これを修正するにはどうすればよいですか?

答えて

13

実行するとdisable_interspersed_args()

#!/usr/bin/env python 
from optparse import OptionParser 

parser = OptionParser() 
parser.disable_interspersed_args() 
parser.add_option("-v", action="store_true", dest="verbose") 
(options, args) = parser.parse_args() 

print "Options: %s args: %s" % (options, args) 

を使用してみてください:

 
$ ./options.py foo -v bar 
Options: {'verbose': None} args: ['foo', '-v', 'bar'] 
$ ./options.py -v foo bar 
Options: {'verbose': True} args: ['foo', 'bar'] 
$ ./options.py foo -a bar 
Options: {'verbose': None} args: ['foo', '-a', 'bar'] 
+0

感謝の練習で、正しいかもしれないにもかかわらず、あなたは...それは非常に徹底的な答えであり、完璧に働いた – Evert

-2

あなたはこのようにbashスクリプトを使用することができます。

#!/bin/bash 
while [ "-" == "${1:0:1}" ] ; do 
    if [ "-v" == "${1}" ] ; then 
    # do something 
    echo "-v" 
    elif [ "-s" == "${1}" ] ; then 
    # do something 
    echo "-s" 
    fi 
    shift 
done 
${@} 

$ {@}はあなたにシフトコールで消費されなかったコマンドラインの残りの部分を提供します。あなたは、単に$ {ホスト} BLA
BLA

テストをエコーtest.sh $ {@}

@ $ {@} へのssh $ {ユーザー}から行を変更sshを使用するには 。 SH -vエコーBLA
-v
BLA

test.sh -v -sエコーBLA
-v
-s
bla

+0

あなたの答えは私のために、これはパイソン – Evert

1

OptionParserインスタンスは、複雑なケースの解析中に実際に操作できます。しかし、このケースでは、あなたが記述したシナリオはすぐにサポートされていると信じています(本当なら、良いニュースでしょう! docs:Querying and manipulating your option parserのこのセクションを参照してください。

disable_interspersed_args()最初の非オプションを停止するように解析する

セット:

は、上記のリンクを引用します。 コマンドプロセッサーに、 のオプションを持つ別のコマンドを実行していて、これらのオプションが混乱しないようにする場合は、これを使用します。たとえば、 各コマンドには異なるオプションセットがあります。

1
from optparse import OptionParser 
import subprocess 
import os 
import sys 

parser = OptionParser() 
parser.add_option("-q", "--quiet", 
        action="store_true", dest="quiet", default=False, 
        help="don't print output") 
parser.add_option("-s", "--signal", 
        action="store_true", dest="signal", default=False, 
        help="signal end of program and return code") 

parser.disable_interspersed_args() 
(options, command) = parser.parse_args() 

if not command: 
    parser.print_help() 
    sys.exit(1) 

if options.quiet: 
    ret = subprocess.call(command, stdout=open(os.devnull, 'w'), 
          stderr=subprocess.STDOUT) 
else: 
    ret = subprocess.call(command) 

if options.signal: 
    print "END OF PROGRAM!!! Code: %d" % ret 
関連する問題