터미널 프로그램 만들기 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을 추가하여 활용해 보세요!











댓글

이 블로그의 인기 게시물

STUDY

vue

Capacitor 웹 기반 애플리케이션을 네이티브 앱으로 감싸고, 네이티브 기능에 접근할 수 있게 해주는 프레임워크