2013-10-03 2 views
0

내 용어가 해제되어 있으면 용서해 주지만 옵션 argparse 인수에 서브 파서를 추가하는 방법을 찾고 있습니다. 각 args에 store_true 플래그가 있습니다.Argparse : store_true 플래그가있는 선택적 서브 파서

if args.shodan.html: 
    print("Doing a thing") 

parser = argparse.ArgumentParser() 
parser.add_argument("-r", "--reverse-dns", help="rDNS on host", action="store_true") 
parser.add_argument("-s", "--shodan", help="perform SHODAN query on discovered IPs", action="store_true") 
parser.add_argument("targets", help="IPv4 addresses to search for", nargs="+") 

subparsers = parser.add_subparsers() 
shodan_parser = subparsers.add_parser("shodan", help="SHODAN options") 
shodan_parser.add_argument("--html", action="store_true") 
shodan_parser.set_defaults(which='shodan') 

출력 :

(venv)[[email protected] gumdrop]$ python gumdrop.py google.ca --shodan --html 
usage: gumdrop.py [-h] [-r] [-e] [-s] targets [targets ...] {shodan} ... 
gumdrop.py: error: too few arguments 

(venv)[[email protected] gumdrop]$ python gumdrop.py --shodan --html google.ca askjeeves.ca 
usage: gumdrop.py [-h] [-r] [-e] [-s] targets [targets ...] {shodan} ... 
gumdrop.py: error: invalid choice: 'askjeeves.ca' (choose from 'shodan') 

이상적으로, 나는 shodan_parser subparser에 --html의 부울 값을 참조하려면 다음 구문을 사용하고 싶습니다


제안 사항이 있으십니까?

+0

Python 2가 맞습니까? 당신이 제공 할 계획 인 커맨드 라인 인수에 따라 예상 결과를 게시 할 수 있습니까? – RyPeck

+0

예상 결과가 무엇을 의미하는지 확신 할 수 없습니다. 'shodan.html'에 부울 플래그를 설정할 수 있기를 원합니다.하지만 가능한지 확실하지 않습니다. –

+0

그런 다음 입력하려는 명령 줄 인수의 예를 제공 할 수 있습니까? – RyPeck

답변

0
parser = argparse.ArgumentParser() 
parser.add_argument("-r", "--reverse-dns", help="rDNS on host", action="store_true") 
parser.add_argument("-s", "--shodan", help="perform SHODAN query on discovered IPs", action="store_true") 
parser.add_argument("targets", help="IPv4 addresses to search for", nargs="+") 
에 의해 사용되기 때문에 당신은 뭔가 다른 "-h"에서 스위치를 변경 (또는 도움을 비활성화)해야합니다

--shodan 옵션 (플래그)이 서브 파서 이름과 관련이 있습니까? 그 목적은 무엇입니까? 플래그를 서브 파서와 혼동하고 있습니까?

하위 파서도 위치에 있습니다. 위치가 nargs='+' 인 서브 파서와 함께 사용하면 효과가 있지만 혼동을 일으킬 수 있습니다. targets의 목록은 언제 끝나고 서브 파서 (및 인수)가 시작됩니까?

subparsers = parser.add_subparsers() 
shodan_parser = subparsers.add_parser("shodan", help="SHODAN options") 
... 

하여 출력

(venv)[[email protected] gumdrop]$ python gumdrop.py google.ca --shodan --html 
.... 

나는이 targets=['google.ca'], shodan=True을 설정 같은데요. 그러나 당신은 서브 파서 명령을주지 않았습니다. --html은 알 수 없습니다.

(venv)[[email protected] gumdrop]$ python gumdrop.py --shodan --html google.ca askjeeves.ca 
... 

이제 기본 파서 플래그 shodan=True을 설정합니다. 다시 --html 알 수 없습니다. 그것은 target=['google.ca']으로 설정합니다. 그러나 지금은 subparser 명령으로 askjeeves.ca을 해석하려고 시도합니다. 그러나 사용 가능한 선택 사항과 일치하지 않습니다.

나는이 라인이 작동 것이라고 생각 :

python gumdrop.py google.ca askjeeves.ca shodan --html 
python gumdrop.py --shodan google.ca shodan --html 

내가 전체 subparser 비트를 삭제 건의 할 것입니다. 그것은 당신과 당신의 사용자에게 혼란스러운 일입니다. 계속해서 주 파서에 을 포함 시키십시오. 선택 사항이므로 자유롭게 사용하거나 무시할 수 있습니다. 서브 파서를 사용하고, 문서를 검토하고, 더 간단한 예제를 시도해야합니다.

args.shodan.html을 얻는 방법은 네임 스페이스의 중첩과 관련된 훨씬 더 발전된 문제입니다. 당신이 args.html을 얻게되면 행복해질 것입니다.

0

은 "-h"스위치가 이미 도움말 메뉴

parser = argparse.ArgumentParser() 
parser.add_argument("-r", "--reverse-dns", help="rDNS on host", action="store_true") 
parser.add_argument("-s", "--shodan", help="perform SHODAN query on discovered IPs", action="store_true")parser.add_argument("targets", help="IPv4 addresses to search for", nargs="+") 

subparsers = parser.add_subparsers() 
shodan_parser = subparsers.add_parser("shodan", help="SHODAN options") 
shodan_parser.add_argument("--html", action="store_true") 
shodan_parser.set_defaults(which='shodan') 

args = parser.parse_args() 

if args.html: 
    print("Doing a thing") 
+0

args.html을 조건으로 스크립트를 실행 한 결과로 내 질문이 업데이트되었습니다. –

관련 문제