터미널 프로그램 만들기 python
터미널 프로그램을 만들고, 이를 명령어로 부를 수 있게 하는 과정은 주로 다음과 같은 단계를 거칩니다. 예제를 통해 Python을 사용해 간단한 CLI(Command Line Interface) 프로그램을 만들고, 이 프로그램을 터미널에서 명령어로 실행할 수 있도록 하는 방법을 설명해 드릴게요.
### 1. 터미널 프로그램의 기본 개념 이해
터미널 프로그램(명령줄 프로그램)은 터미널에서 명령어로 실행할 수 있는 프로그램을 말합니다. 이를 만들려면 다음 두 가지가 필요해요:
1. **프로그램 코드 작성**: 명령어를 입력하면 수행할 작업을 정의하는 코드 작성.
2. **시스템 경로 설정**: 작성한 프로그램을 터미널에서 명령어로 호출할 수 있도록 설정.
Python으로 간단한 CLI 프로그램을 만들어보고, 이를 명령어로 호출하는 과정까지 설명하겠습니다.
### 2. CLI 프로그램 작성
Python을 이용해 간단한 CLI 프로그램을 작성해보겠습니다. 예제로 `hello`라는 명령어를 입력하면 인사말을 출력하는 프로그램을 만들어 볼게요.
1. **Python 프로그램 작성**: `hello.py`라는 파일을 생성하고, 아래와 같이 작성합니다.
```python
# hello.py
import argparse
# ArgumentParser를 통해 명령행 인자를 설정합니다.
parser = argparse.ArgumentParser(description="Simple CLI example")
# --name 옵션을 추가하여 사용자로부터 이름을 입력받도록 설정
parser.add_argument('--name', type=str, help='Your name', default='World')
# 입력받은 인자들을 args로 저장
args = parser.parse_args()
# 인사말 출력
print(f"Hello, {args.name}!")
```
2. **실행하기**:
이 프로그램을 터미널에서 `python hello.py`로 실행하면 `Hello, World!`가 출력됩니다. `--name` 옵션을 추가하여 실행하면, 예를 들어 `python hello.py --name Alice`로 실행하면 `Hello, Alice!`가 출력됩니다.
### 3. Python 프로그램을 명령어로 부를 수 있도록 설정하기
터미널에서 `python hello.py` 대신 `hello` 명령어만으로 실행할 수 있도록 설정하는 방법을 설명하겠습니다.
#### 3.1. 실행 가능한 스크립트로 만들기
파일의 맨 위에 **Shebang**을 추가하여, Python 인터프리터를 지정합니다.
```python
#!/usr/bin/env python3
```
수정된 `hello.py`는 다음과 같습니다:
```python
#!/usr/bin/env python3
import argparse
parser = argparse.ArgumentParser(description="Simple CLI example")
parser.add_argument('--name', type=str, help='Your name', default='World')
args = parser.parse_args()
print(f"Hello, {args.name}!")
```
#### 3.2. 파일에 실행 권한 부여하기
파일을 실행 가능하도록 권한을 부여해야 합니다. 터미널에서 다음 명령어를 입력합니다:
```bash
chmod +x hello.py
```
#### 3.3. PATH에 추가하여 명령어로 호출하기
파일을 현재 디렉토리에서만 호출할 수 있다면 불편하므로, **시스템 PATH**에 추가하여 어디서든 실행할 수 있도록 설정합니다.
1. 파일을 `/usr/local/bin` 또는 `~/bin` 같은 디렉토리에 복사하거나 이동합니다:
```bash
sudo mv hello.py /usr/local/bin/hello
```
2. `/usr/local/bin`은 기본적으로 시스템의 PATH에 포함되어 있으므로, `hello` 명령어를 터미널에서 입력하면 이제 프로그램이 실행됩니다.
#### 3.4. 터미널에서 실행 확인
터미널에서 다음과 같이 입력하여 프로그램을 호출할 수 있습니다:
```bash
hello --name Alice
```
위 명령어를 입력하면, `Hello, Alice!`가 출력됩니다. 이제 `hello.py` 파일을 명령어 `hello`로 실행할 수 있게 되었어요!
### 4. CLI 프로그램 배포 및 설치
위 과정처럼 프로그램을 직접 실행 가능하도록 만들고 파일을 `/usr/local/bin`에 넣어 PATH에 추가하는 방식도 좋지만, Python에서는 CLI 프로그램을 좀 더 체계적으로 배포하고 설치할 수 있는 방법도 있어요.
#### 4.1. `setup.py`를 이용한 패키지화 및 설치
Python에서는 `setup.py` 파일을 이용해 프로그램을 패키지화하고, 이를 `pip`를 통해 설치할 수 있도록 설정할 수 있습니다.
1. 프로젝트 디렉토리에 `setup.py` 파일을 생성하고, 다음과 같이 작성합니다:
```python
# setup.py
from setuptools import setup
setup(
name='hello-cli', # 패키지 이름
version='0.1',
py_modules=['hello'], # hello.py 모듈 포함
entry_points={
'console_scripts': [
'hello=hello:main', # hello 명령어를 hello.py의 main 함수와 연결
],
},
)
```
2. `hello.py` 파일에 `main` 함수를 정의합니다:
```python
# hello.py
import argparse
def main():
parser = argparse.ArgumentParser(description="Simple CLI example")
parser.add_argument('--name', type=str, help='Your name', default='World')
args = parser.parse_args()
print(f"Hello, {args.name}!")
if __name__ == "__main__":
main()
```
3. 프로젝트를 패키지로 설치합니다:
```bash
pip install --editable .
```
`--editable` 옵션은 패키지를 현재 디렉토리에서 설치하여, 파일을 수정하면 설치된 패키지도 자동으로 반영되도록 해줍니다.
4. 이제 `hello` 명령어를 입력하면 CLI 프로그램이 실행됩니다:
```bash
hello --name Alice
```
결과: `Hello, Alice!` 출력
### 5. 다른 언어로 터미널 프로그램 만들기
Python 외에도 C, C++, Rust, Go 등의 언어를 이용해 터미널 프로그램을 만들 수 있습니다. 이 경우 컴파일된 바이너리를 `/usr/local/bin`에 두거나, Makefile을 작성하여 설치 스크립트를 만들어 CLI 프로그램을 관리할 수 있습니다.
---
# 기본적인 `argparse` 사용법과 위치 인자 및 옵션 혼합 사용 예제
### 예제 1: 위치 인자만 사용하는 기본 예제
```python
import argparse
# ArgumentParser 객체 생성
parser = argparse.ArgumentParser(description="숫자를 더하거나 빼는 프로그램")
# 위치 인자 정의
parser.add_argument("x", type=int, help="첫 번째 숫자")
parser.add_argument("y", type=int, help="두 번째 숫자")
# 명령줄 인자 파싱
args = parser.parse_args()
# 파싱된 인자 사용
result = args.x + args.y
print(f"{args.x} + {args.y} = {result}")
```
### 실행 방법
```bash
python example.py 5 3
```
### 출력 결과
```
5 + 3 = 8
```
- `example.py` 파일에서 `5`와 `3`이 각각 `x`와 `y` 위치 인자로 인식되어 더하기 결과를 출력합니다.
### 예제 2: 위치 인자와 선택적 옵션을 혼합한 예제
```python
import argparse
# ArgumentParser 객체 생성
parser = argparse.ArgumentParser(description="숫자를 더하거나 빼는 프로그램")
# 위치 인자 정의
parser.add_argument("x", type=int, help="첫 번째 숫자")
parser.add_argument("y", type=int, help="두 번째 숫자")
# 선택적 옵션 추가
parser.add_argument("--subtract", "-s", action="store_true", help="숫자를 뺍니다")
# 명령줄 인자 파싱
args = parser.parse_args()
# 더하기 또는 빼기 연산
if args.subtract:
result = args.x - args.y
print(f"{args.x} - {args.y} = {result}")
else:
result = args.x + args.y
print(f"{args.x} + {args.y} = {result}")
```
### 실행 방법
```bash
python example.py 10 4
```
### 출력 결과
```
10 + 4 = 14
```
`--subtract` 옵션을 주는 경우:
```bash
python example.py 10 4 --subtract
```
### 출력 결과
```
10 - 4 = 6
```
### 예제 3: 여러 개의 선택적 옵션을 사용하는 예제
```python
import argparse
# ArgumentParser 객체 생성
parser = argparse.ArgumentParser(description="간단한 문자열 처리 프로그램")
# 선택적 옵션 정의
parser.add_argument("--uppercase", "-u", action="store_true", help="문자열을 대문자로 변환합니다")
parser.add_argument("--reverse", "-r", action="store_true", help="문자열을 뒤집습니다")
# 위치 인자 정의
parser.add_argument("text", help="처리할 문자열")
# 명령줄 인자 파싱
args = parser.parse_args()
# 입력 문자열 처리
result = args.text
if args.uppercase:
result = result.upper()
if args.reverse:
result = result[::-1]
print(f"처리된 문자열: {result}")
```
### 실행 방법
```bash
python example.py "hello world" -u
```
### 출력 결과
```
처리된 문자열: HELLO WORLD
```
옵션 `--reverse`를 추가하면:
```bash
python example.py "hello world" -u -r
```
### 출력 결과
```
처리된 문자열: DLROW OLLEH
```
이처럼 `argparse`를 사용하면 위치 인자와 선택적 옵션을 결합하여 원하는 방식으로 CLI 프로그램을 작성할 수 있습니다.
### 예제 설명
- **예제 1**: 위치 인자만을 사용하여 숫자 2개를 더하는 간단한 프로그램.
- **예제 2**: 위치 인자와 `--subtract` 옵션을 사용하여 숫자를 더하거나 뺄 수 있도록 설정.
- **예제 3**: 문자열을 대문자로 변환하거나 뒤집는 옵션을 추가하여 다양한 입력 옵션을 처리.
이렇게 하면 `argparse`를 사용한 기본적인 CLI 프로그램의 구조를 이해할 수 있습니다.
---
# Shebang이란
Shebang(쉘방, 또는 샤뱅)은 유닉스 및 리눅스 기반 시스템에서 **스크립트 파일을 실행할 때 사용하는 특별한 구문**으로, 스크립트의 해석기(인터프리터)를 지정하기 위해 파일의 맨 앞에 작성됩니다. 흔히 `#!`로 시작하는데, 이를 "shebang" 또는 "hashbang"이라고 부릅니다. 이 구문을 통해 운영체제는 해당 스크립트를 실행할 때 어떤 프로그램으로 해석할지를 알 수 있게 됩니다.
### 1. Shebang의 형식
Shebang은 다음과 같은 형식으로 작성됩니다:
```
#!/path/to/interpreter
```
- `#!`는 쉘방을 나타내는 고정된 기호입니다.
- `/path/to/interpreter`는 해당 스크립트를 해석할 인터프리터의 경로를 지정합니다.
- 예를 들어, Python 스크립트의 경우 Python 인터프리터의 경로를 지정하고, Bash 스크립트의 경우 Bash 셸의 경로를 지정합니다.
#### 예제
- **Python 스크립트** (`hello.py`):
```python
#!/usr/bin/env python3
print("Hello, World!")
```
이 스크립트는 `python3` 인터프리터를 사용하여 실행됩니다.
- **Bash 스크립트** (`script.sh`):
```bash
#!/bin/bash
echo "This is a Bash script."
```
이 스크립트는 `/bin/bash` 셸을 사용하여 실행됩니다.
### 2. Shebang이 하는 역할
Shebang은 주로 다음과 같은 역할을 합니다:
1. **인터프리터 지정**:
- Shebang을 통해 스크립트를 해석할 프로그램을 명시적으로 지정할 수 있습니다. 예를 들어, 같은 `.py` 파일이어도 Python 2와 Python 3을 구분하여 실행할 수 있습니다.
```bash
#!/usr/bin/env python3 # Python 3으로 실행
#!/usr/bin/env python2 # Python 2로 실행
```
2. **스크립트 파일을 명령어처럼 실행**:
- 스크립트 파일을 직접 실행할 수 있도록 해줍니다. 예를 들어, `./hello.py`와 같이 스크립트를 실행할 때, `hello.py` 파일이 해석기 없이 직접 실행될 수 있게 합니다.
3. **다양한 언어 지원**:
- Python뿐만 아니라, Bash, Perl, Ruby, Node.js 등의 다양한 스크립트 언어를 지원합니다.
### 3. Shebang의 예제 및 동작 방식
#### Python 스크립트 예제
`hello.py` 파일을 만들어 보겠습니다.
```python
#!/usr/bin/env python3
print("Hello, World!")
```
1. **파일에 실행 권한 부여**:
`chmod` 명령어를 이용해 파일에 실행 권한을 부여합니다:
```bash
chmod +x hello.py
```
2. **스크립트 실행**:
이제 `python hello.py` 대신 `./hello.py`로 스크립트를 실행할 수 있습니다.
```bash
./hello.py
```
결과: `Hello, World!`
#### Bash 스크립트 예제
`say_hello.sh` 파일을 만들어 보겠습니다.
```bash
#!/bin/bash
echo "Hello from Bash!"
```
1. **파일에 실행 권한 부여**:
```bash
chmod +x say_hello.sh
```
2. **스크립트 실행**:
```bash
./say_hello.sh
```
결과: `Hello from Bash!`
#### Shebang 없는 스크립트 실행 예
만약 `hello.py` 파일에서 Shebang을 제거하고 실행한다면:
```python
print("Hello, World!")
```
이 경우, 다음과 같이 실행해야 합니다:
```bash
python hello.py
```
즉, 인터프리터를 직접 명시하여 실행해야 합니다. `./hello.py`로 실행하려고 하면, 파일이 어떻게 해석될지 몰라서 오류가 발생하거나, 운영체제가 기본 셸(Bash)로 스크립트를 실행하려고 시도할 수 있습니다.
### 4. `/usr/bin/env`를 사용하는 이유
많은 스크립트에서 Shebang을 다음과 같이 작성하는 경우를 볼 수 있습니다:
```bash
#!/usr/bin/env python3
```
이렇게 `#!/usr/bin/env`를 사용하는 이유는, Python 또는 다른 인터프리터가 **시스템마다 설치된 경로가 다를 수 있기 때문**입니다.
- `/usr/bin/python3`와 `/usr/local/bin/python3` 등 경로가 다를 수 있어요.
- `/usr/bin/env`는 환경 변수 `$PATH`에 따라 `python3` 인터프리터의 경로를 찾아줍니다.
즉, `#!/usr/bin/env python3`는 더 **유연한** 방법으로, 다양한 시스템 환경에서 동일한 스크립트를 사용할 수 있도록 해줍니다.
### 5. Shebang의 유용한 사용 사례
다양한 언어 및 셸 스크립트에서 Shebang을 활용할 수 있습니다:
- **Bash 스크립트**: `#!/bin/bash`
- **Python 스크립트**: `#!/usr/bin/env python3`
- **Node.js 스크립트**: `#!/usr/bin/env node`
- **Ruby 스크립트**: `#!/usr/bin/env ruby`
- **Perl 스크립트**: `#!/usr/bin/env perl`
각 스크립트 파일에서 Shebang을 설정해 두면, 해당 스크립트를 실행할 때 해석기를 지정하지 않고도 명령어처럼 실행할 수 있게 돼요.
### 6. 주의사항
1. **Windows에서는 Shebang이 동작하지 않음**:
- Windows는 기본적으로 Shebang을 지원하지 않아요. Windows에서는 `.bat` 파일이나 PowerShell 스크립트(`.ps1`)를 사용하거나, WSL(Windows Subsystem for Linux) 환경에서 실행해야 Shebang이 동작합니다.
2. **경로 문제**:
- `#!/usr/bin/env`를 사용하더라도, `$PATH` 환경 변수에 인터프리터가 포함되지 않으면 스크립트 실행이 실패할 수 있어요. 이를 해결하려면 인터프리터가 설치된 경로를 확인하고 `$PATH`에 추가해야 합니다.
### 7. 결론
Shebang은 유닉스 및 리눅스 기반 시스템에서 스크립트를 실행할 때 **해석기를 지정**하기 위해 사용하는 특별한 구문입니다. 이를 통해 스크립트 파일을 명령어처럼 실행할 수 있고, 인터프리터를 명시하지 않아도 바로 실행할 수 있게 해줍니다. 다양한 스크립트 언어에서 Shebang을 설정하면 실행 편의성이 크게 높아지니, 사용하는 언어에 맞는 Shebang을 추가하여 활용해 보세요!
댓글
댓글 쓰기