2

python3のargparseモジュールを使用して次のコマンドライン構文を解析する方法を探しています。

myapp.py [folder] [[from] to]

意味:ユーザーはオプションでフォルダーを定義できます。デフォルトはcwdです。さらに、ユーザーは最大2つの整数を渡すことができます。to番号が1つだけ指定されている場合は、変数に格納する必要があります。これは、python組み込みの構文に似ていますrange()

例えば:

myapp.py folder
myapp.py 10
myapp.py 5 10
myapp.py folder 5 10
myapp.py folder 10

それは可能ですか?もしそうなら、どのように?

4

4 に答える 4

1

オプションを使用します。それが彼らの目的です(そしてargparse構文解析が得意なのです)。

したがって、次のような構文

myapp.py [-F folder] [[from] to]

はるかに理にかなっており、解析が容易になります。

于 2012-10-18T18:53:12.987 に答える
1

あなたはかなりばかげたことをすることができます:

import argparse
import os

class MyAction(argparse.Action):
    def __call__(self,parser,namespace,values,option_string=None):
        namespace.numbers = []
        namespace.path = os.getcwd()
        for v in values:
            if os.path.isdir(v):
                namespace.path = v
            else:
                try:
                    namespace.numbers.append(int(v))
                    if len(namespace.numbers) > 2
                       parser.error("Barg2!!!")
                except ValueError:
                    parser.error("Barg!!!")

p = argparse.ArgumentParser()
p.add_argument('stuff',nargs='*',action=MyAction)
n = p.parse_args()
print n

ただし、これを行う場合は、sys.argv自分で処理することもできます。実際のオプションをここで使用することを検討する必要があります...

于 2012-10-18T19:00:42.390 に答える
0

sys.argvを自分で解析することもお勧めします。

FWIW、私はargparseなどが機能するプロジェクトでもsys.argvを解析します。これは、sys.argvを自分で解析するとpylintまたはflake8でうまく機能するためです。

于 2012-10-18T19:05:41.930 に答える
0

フォルダに名前付き引数を使用せずにそれを行う方法を見つけることができませんでした:

# usage: argparsetest2.py [-h] [--folder [FOLDER]] [to] [fr]

import argparse
import os

parser = argparse.ArgumentParser()
parser.add_argument('--folder', dest='folder', nargs='?', default=os.getcwd())
parser.add_argument('to', type=int, nargs='?')
parser.add_argument('fr', type=int, nargs='?')
args = parser.parse_args()

print args
于 2012-10-18T19:15:45.453 に答える