Python에서 명령줄 인수 구문 분석하기
sys.argv 사용하기:
가장 기본적인 방법은 sys.argv
모듈을 사용하는 것입니다. 이 모듈은 스크립트에 전달된 모든 인수를 리스트 형태로 제공합니다.
import sys
if len(sys.argv) > 1:
print(sys.argv[1])
else:
print("인수가 제공되지 않았습니다.")
이 코드는 첫 번째 인수만 출력합니다. sys.argv
를 사용하는 것은 간단하지만, 복잡한 인수 처리에는 적합하지 않습니다.
getopt 사용하기:
getopt
모듈은 명령줄 옵션을 처리하는 데 더 강력한 기능을 제공합니다. 옵션과 값을 구분하고, 옵션에 대한 형식 검증을 수행하고, 옵션의 약식을 정의할 수 있습니다.
import getopt
opts, args = getopt.getopt(sys.argv[1:], "ho:v", ["help", "output="])
for opt, arg in opts:
if opt in ("-h", "--help"):
print("사용 방법:")
# ...
elif opt in ("-o", "--output"):
output_file = arg
else:
print("알 수 없는 옵션:", opt)
이 코드는 -h
또는 --help
옵션을 사용하면 도움말을 출력하고, -o
또는 --output
옵션을 사용하면 출력 파일 이름을 설정합니다. getopt
는 sys.argv
보다 더 유연하지만, 다소 복잡하고 명확하지 않을 수 있습니다.
argparse 사용하기:
argparse
모듈은 Python 3에서 도입된 명령줄 인수 처리를 위한 표준 라이브러리입니다. getopt
보다 사용하기 쉽고 명확하며, 다양한 기능을 제공합니다.
import argparse
parser = argparse.ArgumentParser(description="텍스트 파일을 처리하는 스크립트")
parser.add_argument("filename", help="입력 파일 이름")
parser.add_argument("-v", "--verbose", action="store_true", help="자세한 출력")
args = parser.parse_args()
# 파일 처리...
if args.verbose:
print("파일 처리 완료")
이 코드는 입력 파일 이름을 필수 인수로 받고, -v
또는 --verbose
옵션을 사용하면 자세한 출력을 제공합니다. argparse
는 명확하고 유연하며 사용하기 쉬운 강력한 도구입니다.
최적의 방법 선택:
사용에 가장 적합한 방법은 스크립트의 요구 사항에 따라 다릅니다. 간단한 스크립트의 경우 sys.argv
가 충분할 수 있습니다. 하지만, 더 복잡한 인수 처리가 필요한 경우에는 getopt
또는 argparse
를 사용하는 것이 좋습니다. argparse
는 일반적으로 가장 사용하기 쉬우고 유연하며 강력하기 때문에 대부분의 경우 최선의 선택입니다.
예제 코드: 명령줄 인수를 사용하여 파일 복사하기
import argparse
import shutil
parser = argparse.ArgumentParser(description="두 파일을 복사합니다.")
parser.add_argument("source", help="원본 파일")
parser.add_argument("destination", help="복사 대상 파일")
args = parser.parse_args()
try:
shutil.copyfile(args.source, args.destination)
print("파일 복사 완료:", args.source, "->", args.destination)
except FileNotFoundError:
print(f"오류: 파일을 찾을 수 없습니다: {args.source}")
이 스크립트를 다음과 같이 실행하면 첫 번째 파일을 두 번째 파일에 복사합니다.
python copy.py source.txt dest.txt
옵션을 사용하여 자세한 출력을 활성화할 수 있습니다.
python copy.py -v source.txt dest.txt
이 스크립트는 다음과 같은 출력을 생성합니다.
파일 복사 완료: source.txt -> dest.txt
추가 예제
다음은 getopt
를 사용하여 파일 이름과 옵션을 처리하는 스크립트입니다.
import getopt
import sys
def main():
try:
opts, args = getopt.getopt(sys.argv[1:], "ho:v", ["help", "output="])
except getopt.GetoptError as err:
print(f"오류: {err}")
return
for opt, arg in opts:
if opt in ("-h", "--help"):
print("사용 방법:")
# ...
elif opt in ("-o", "--output"):
output_file = arg
else:
print("알 수 없는 옵션:", opt)
if len(args) != 1:
print("오류: 정확히 하나의 파일 이름을 지정해야 합니다.")
return
filename = args[0]
# 파일 처리...
if output_file:
with open(output_file, "w") as f:
# 처리 결과를 파일에 기록
pass
else:
print("처리 결과:")
# 처리 결과를 표시
if __name__ == "__main__":
main()
이 스크립트를 다음과 같이 실행하면 파일을 처리하고 결과를 콘솔에 출력합니다.
python process.py input.txt
-o
또는 --output
옵션을 사용하면 결과를 파일에 저장할 수 있습니다.
python process.py input.txt -o output.txt
Python에서 명령줄 인수 구문 분석하기: 대체 방법
click 사용하기:
click
은 강력하고 사용자 친화적인 명령줄 인터페이스를 구축하기 위한 Python 라이브러리입니다. 옵션, 인수, 서브 명령을 정의하는 데 도움이 되는 데코레이터와 유용한 기능을 제공합니다.
import click
@click.command()
@click.argument("filename", help="입력 파일 이름")
@click.option("-v", "--verbose", is_flag=True, help="자세한 출력")
def process_file(filename, verbose):
# 파일 처리...
if verbose:
print("파일 처리 완료")
if __name__ == "__main__":
process_file()
이 코드는 click
을 사용하여 입력 파일 이름을 인수로 받고, -v
또는 --verbose
옵션을 사용하면 자세한 출력을 제공하는 스크립트를 만듭니다. click
은 명확하고 사용하기 쉬우며, 다양한 기능을 제공합니다.
docopt
는 명령줄 인터페이스를 위한 간단하고 사용하기 쉬운 Python 라이브러리입니다. argparse
와 유사하지만, YAML 또는 Python 코드를 사용하여 명령줄 옵션을 정의하는 간결한 구문을 제공합니다.
"""
텍스트 파일을 처리하는 스크립트
사용 방법:
process_file.py [옵션] <filename>
옵션:
-h, --help 도움말 출력
-v, --verbose 자세한 출력
"""
import docopt
def process_file(filename, verbose):
# 파일 처리...
if verbose:
print("파일 처리 완료")
if __name__ == "__main__":
arguments = docopt(__doc__)
process_file(arguments["<filename>"], arguments["--verbose"])
객체 지향 접근 방식 사용하기:
명령줄 인수를 처리하는 데 객체 지향 프로그래밍 방식을 사용할 수도 있습니다. 각 인수와 옵션을 나타내는 별도의 클래스를 만들고, argparse
또는 click
과 같은 라이브러리를 사용하여 이러한 클래스를 인스턴스화하여 처리할 수 있습니다. 이 방법은 복잡한 명령줄 인터페이스를 구현할 때 유용할 수 있지만, 코드가 다소 더 복잡해질 수 있습니다.
python command-line command-line-arguments