この単純化されたスクリプトは問題を引き起こすのに十分です...「-d」引数が有効なディレクトリであるかどうかを確認し、指定されていない場合はデフォルトを提供します...
#!/usr/bin/python
import os
import argparse
def valid(dir):
subdir = dir + '/Desktop'
if not os.path.exists(subdir):
raise argparse.ArgumentTypeError("%s is not a valid directory" % subdir)
return dir
parser = argparse.ArgumentParser(description="blah blah blah")
parser.add_argument('-d', '--directory', help='directory to check', default=os.getcwd(), type=valid)
args = parser.parse_args()
また、デフォルトの引数が何であるかは関係ありません。スクリプトを実行すると、コマンドラインに何を入力してもデフォルトが使用され、次のようにキャッチされない例外がスローされます。
Traceback (most recent call last):
File "./parsertest.py", line 15, in <module>
args = parser.parse_args()
File "/usr/lib/python2.7/argparse.py", line 1688, in parse_args
args, argv = self.parse_known_args(args, namespace)
File "/usr/lib/python2.7/argparse.py", line 1710, in parse_known_args
default = self._get_value(action, default)
File "/usr/lib/python2.7/argparse.py", line 2239, in _get_value
raise ArgumentError(action, msg)
argparse.ArgumentError: argument -d/--directory: /home/users/jrice/Desktop/Desktop is not a valid directory
正常に実行されます。つまり、適切に ArgumentTypeError を適切なタイミングで処理し、次のようにするとメッセージを出力するだけです。
- 「default=」引数を削除します
- dir に '/Desktop' を追加しないで、subdir = dir にするか、単に dir 自体をチェックしてください
- ホームディレクトリからスクリプトを実行!?!?
詳細: 上記のいずれかを実行すると、「-d」が有効でなくても、すべて問題ありません。これは私が望む出力です。
>./Desktop/parsertest.py -d blah
usage: parsertest.py [-h] [-d DIRECTORY]
parsertest.py: error: argument -d/--directory: blah/Desktop is not a valid directory
なぜ os.getcwd() + '/Desktop' が異なるのでしょうか?