2017-01-10 1 views
4

나는 테스트 이름을 찾고 우리 회사에서 널리 사용되는 스크립트를 가지고있다. 그것은과 같이 명령 행에서 작동 : 스크립트 내부argparse를 사용하는 스크립트를 다른 파이썬 스크립트 내에서 호출 가능하도록 리팩터링하는 방법은 무엇입니까?

find_test.py --type <type> --name <testname> 

가 동등한이다 :

import argparse 

parser = argparse.ArgumentParser(description='Get Test Path') 
parser.add_argument('--type',  dest='TYPE',  type=str,   default=None, help="TYPE [REQUIRED]") 
parser.add_argument('--name',  dest='test_name', type=str,   default=None, help="Test Name (Slow)") 
parser.add_argument('--id',  dest='test_id', type=str,   default=None, help="Test ID (Fast)") 
parser.add_argument('--normalise', dest='normalise', action="store_true", default=False, help="Replace '/' with '.' in Test Name") 
args = parser.parse_args() 

(확실하지 모든 인수가하는 일, 내가 개인적으로 첫 번째 두 개를 사용). 그런 다음이 인수는이 인수를 사용하는 코드에 의해 진행됩니다.

이 스크립트를 리팩토링하여 모듈로 가져올 수 있도록하고 싶지만 명령 줄 기능을 보존하고 있습니다. 많은 사람들이이 스크립트를 사용하며 일부 csh 스크립트에서 호출되기도합니다.

내가 지금처럼, 지금까지 그것을 리팩토링 한 :

def _main(): 
    <all the former code that was in find_test.py> 

if __name__ == "__main__": 
    _main() 

을 그리고이 여전히 명령 줄에서 잘 실행됩니다. 그러나 부모 스크립트에서 어떻게 관련 스위치가 포함 된 인수를이 항목에 전달하는지 알지 못합니다.

어떻게 이것을 리팩토링하고 상위 스크립트에서 호출 할 수 있습니까? 이것이 가능합니까?

필자가 읽은 docopts는 필요하지 않으면 새로운 argparse를 사용하지 않을 것입니다. 즉, 회사 전체에 설치되지 않았고 힘든 절차가 될 수 있기 때문에 argparse를 사용할 수 없습니다.

답변

3

모든 코드를 함수로 직접 이동하면 안됩니다. 그것은 전혀 도움이되지 않습니다.

당신이해야 할 일은 무엇이든지 기능을 수행해야하는 코드를 옮기는 것입니다. (외부 인터페이스이므로 외부 인터페이스 인 _으로 시작하면 안됩니다.) 명령 행에서 실행해야하는 코드 (예 : 파서 ​​등)는 이 블록에 인 채로 있어야하며 결과는 다음과 같이 전달되어야합니다. main().

그래서 :

def main(TYPE, test_name, test_id=None, normalise=False): 
    # ... body of script... 

if __name__ == "__main__": 
    parser = ... 
    ... 
    args = parser.parse_args() 
    main(**vars(args)) 

(. 그리고 docopt 새로운 아무것도 아니다, 그것은 어떤 사람들이 좋아하는 외부 라이브러리의)

관련 문제