2017-11-06 17 views
0

두 개의 스크립트가 있습니다. 그 main() for 루프에 인수를 전달하여 첫 번째, Script1.py, 수입 Script2.py 및 사용외부 스크립트에서 명령 줄 인수 열거

vol.py: error: unrecognized arguments: --profile=WinXPSP3x86 -f B:/vmem/zeus.vmem connscan 
: Script1.py이 실행 된 경우

for ipNum in ipList: 
     print("Checking databases for: " + ipNum) 
     Script2.main("--ip " + ipNum) 

그러나, 나는 erorr를 얻을 수 주요

는() Script2.py에서 다음과 같습니다

def main(args): 
    parser = argparse.ArgumentParser(description='Is This IP Bad?') 
    parser.add_argument('-i', '--ip', help='IP address to check') 
    parser.add_argument('--success', help='Also display GOOD', required=False, action="store_true") 
    args = parser.parse_args() 

    if args is not None and args.ip is not None and len(args.ip) > 0: 
     badip = args.ip 
    else: 
     my_ip = urlopen('http://icanhazip.com').read().rstrip() 

인식 할 수없는 인수입니다 물론, script1이를 launchung 때 입력 된 명령 행 인수. script2 main()을 여러 번 실행하기 위해 단일 인수 목록을 적절하게 열거하는 방법은 무엇입니까?

+0

내가 (주 밖으로 argparse 물건을 이동 것)과는 최상위 레벨 스크립트로 뭔가 : –

+0

당신은 단지에 전달할 수 있다면 하나의 스크립트 내에서 명령 줄 인수를 통해 데이터를 전달하는 아무 이유도 없다 함수. 'script1.py'가'from script2 import do_stuff'와'do_stuff ('1.2.3.4', True)'와 같은 것을 할 수 있도록 코드를 재구성하십시오. – Blender

+0

인수 목록은 문자열이 아닌 배열이어야합니다 (실제와 마찬가지입니다 : OS는 프로그램에 * list *를 건네줍니다; 쉘에서 문자열로 입력 된 명령에서 해당 목록을 생성하는 것은 쉘 자체에서 수행됩니다). –

답변

0

각 .par 파일의 '최상위 레벨'에서 모든 argparse 처리를하는 것이 더 좋다고 생각합니다.이 파일은 스크립트가 실행될 때만 실행되며, 가져온/호출 할 때 elsehwere에서 실행됩니다. 그런 다음 호출 된 스크립트가 명령 줄 인수 중 일부를 '사용'하는 것에 신경을 쓰지 않아도되고 예상치 못한 인수가 있으면이를 질식시킬 필요가 없습니다.

그래서 명령 줄 인수 스크립트로 실행 될 수 있음을 각 평 파일은 다음과 같습니다 :

import x 
import y 
import argparse 

def main(a, b, c): 
    some code 

if __name__ == '__main__': 
    parser = argparse.ArgumentParser(description='a desc') 
    parser.add_argument('--a') 
    parser.add_argument('--b') 
    parser.add_argument('--c') 
    args = parser.parse_args() 
    main(args.a, args.b, args.c) 

Script2에 main() 함수 밖으로 argparse 물건을 이동보십시오, 및 script1이 정기적 인 인수) (주 전화 :

:

def main(ip=None, Sucess=None): 
    if ip is None: 
     ip=urlopen('http://icanhazip.com').read().rstrip() 


If __name__ == '__main__': 
    parser = argparse.ArgumentParser(description='Is This IP Bad?') 
    parser.add_argument('-i', '--ip', help='IP address to check') 
    parser.add_argument('--success', help='Also display GOOD', required=False, action="store_true") 
    args = parser.parse_args() 
    main(args.ip, args.success) 

는 다음과 같은 뭔가 다른 스크립트에서 호출210

+0

이것은 작동하지 않습니다. 'global name'args '가 정의되지 않았습니다'오류가 발생했습니다. – TacoB0t

+0

문제를 재현 한 최소 코드 샘플을 붙여 넣을 수 있습니까? –

0

Script2.py가 Script1.py에서만 호출 될 경우 Script2에서 argparse를 사용하는 것이 맨 위에 있습니다. 대신 Script2에서 Script1으로 관련 메서드를 가져와 동일한 네임 스페이스에있는 것처럼 사용합니다 (현재는 있기 때문에).

Script1은 argparse를 사용하여 필요한 경우 명령 줄에서 항목을 가져 와서 Script2에 전달할 수 있습니다. 이를 통해 Script2는 IP 관련 동작에 집중할 수 있으며 Script1은 사용자 상호 작용에 집중할 수 있습니다. 이 같은

# Script1.py 
import sys, argparse 
from Script2.py import * 
def main() 
    parser = argeparse.ArgumentParser(description="Parse arguments passed to Script1.py") 
    parser.add_argument(default="None", nargs="?", dest="x", action="store", help="An optional variable named x which will default to None.") 
    args = parser.parse_args(sys.argv[1:]) 
    ip = args.x 

    ipChecker(ip) 

if __name__ == '__main__': 
    main() 


# Script2.py 
def ipChecker(self, ip): 
    if ip is not None: 
     my_ip = ip 
    else: 
     my_ip = urlopen('http://icanhazip.com').read().rstrip() 
    # do stuff with my_ip 

if __name__ == '__main__': 
    ipChecker()