5

私は、リモートサーバー上でコマンドを実行することになっている小さなプログラムを書いています(かなり馬鹿げたラッパーとしましょうssh [hostname] [command])。

私はそれをそのように実行したい:

./floep[コマンド]

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

./floep-v[コマンド]

そのため、これにはoptparse.OptionParserを使用することにしました。問題は、コマンドに引数が含まれていることもあります。これは、次の場合に正常に機能します。

./floep -v "uname -a"

しかし、私はそれを使用するときにも機能させたいと思っています:

./floep -v uname -a

アイデアは、最初のオプション以外の引数に出くわすとすぐに、それ以降のすべてが私のコマンドの一部になるはずです。

しかし、これは私に与えます:

使用法:floep[オプション]

floep:エラー:そのようなオプションはありません:-a

OptionParserはこの構文をサポートしていますか?もしそうなら:どのように?そうでない場合:これを修正するための最良の方法は何ですか?

4

4 に答える 4

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 バー
オプション: {'verbose': なし} args: ['foo', '-v', 'bar']
$ ./options.py -v foo バー
オプション: {'verbose': True} args: ['foo', 'bar']
$ ./options.py foo -バー
オプション: {'verbose': なし} args: ['foo', '-a', 'bar']
于 2009-04-03T23:33:45.123 に答える
1

OptionParser インスタンスは、複雑なケースの解析操作中に実際に操作できます。ただし、この場合、説明したシナリオはそのままでサポートされていると思います(これが本当なら朗報です!それはどのくらいの頻度で起こりますか??)。ドキュメントのこのセクションを参照してください: Querying and manipulating your option parser

上記のリンクを引用するには:

disable_interspersed_args()

最初の非オプションで停止するように解析を設定します。独自のオプションを持つ別のコマンドを実行するコマンド プロセッサがあり、これらのオプションが混乱しないようにしたい場合は、これを使用します。たとえば、各コマンドには異なるオプション セットが含まれている場合があります。

于 2009-04-03T23:29:02.077 に答える
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
于 2009-04-03T23:43:06.880 に答える
-1

次のような 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
${@}

${@} は、シフト呼び出しによって消費されなかった残りのコマンド ラインを提供します。ssh を使用するには、行を ${@} から ssh ${user}@${host} ${@} に変更するだけです

test.sh echo bla
bla

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

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

于 2009-04-03T23:03:02.280 に答える