티켓 도구에 필요한 패키지 선택하기

PythonBeginner
지금 연습하기

소개

BenchTicket은 행사 주문을 창구에서 쓸 수 있는 가격표로 바꿉니다. 현재 설치는 두 소스를 검색하며, 설치에 성공해도 같은 이름의 대체 패키지가 가격을 바꿉니다.

정상 업무 출력을 비교하고 설치된 의존성을 확인한 다음 승인된 도구를 재구축하는 설치 절차를 저장합니다. 패키지 이름과 소스는 모두 합성되었으며 이 실습 안에만 있습니다. 기본 터미널과 텍스트 파일 사용 능력이 필요하며 Python 프로그래밍은 필요 없습니다.

티켓 창구의 정상 예제 읽기

의존성을 바꾸기 전에 가격표를 이해합니다. Terminal에서 시작하세요. cd는 디렉터리를 이동합니다. 절대 경로는 현재 위치와 관계없이 동작합니다.

cd /home/labex/project/ticket-build

orders.csv는 작은 쉼표 구분 표입니다. 주문마다 ID, 성인과 어린이 수, 회원 값이 있습니다. cat으로 표시합니다.

cat orders.csv

성인은 1200센트, 어린이는 600센트입니다. 성인과 어린이가 각각 두 명 이상이면 400센트 할인되고, 회원은 추가로 200센트 할인되며 최솟값은 0입니다. 1센트는 통화 단위의 100분의 1입니다.

준비된 demo는 별도의 승인 예제 설치를 실행하며 프로젝트 환경을 완성하지는 않습니다.

/opt/labex-lookalike/demo

T101은 3200,32.00, T103은 1600,16.00, T104는 그대로 0이어야 합니다. 이 관계는 패키지 버전 표시보다 중요합니다. 원본 주문과 앱을 유지하세요.

설치는 성공했지만 가격은 틀린 상황 관찰하기

설치 성공과 업무 결과의 정확성을 구별합니다. Terminal의 ticket-build에 머무르세요.

가상 환경은 프로젝트 전용 Python 패키지를 보관합니다. python3는 인터프리터이고 -m은 모듈을 실행합니다. venv 모듈은 환경을 만듭니다. 준비된 pip가 --python으로 다른 환경을 관리하므로 --without-pip은 두 번째 pip 사본을 생략합니다.

python3 -m venv --without-pip .venv

준비된 설치 절차를 읽으세요.

cat install.sh

bash는 이 스크립트를 실행합니다. "$1"은 첫 번째 인수인 환경 경로입니다. 따옴표가 경로를 하나로 유지합니다. set -e는 설치가 실패하면 스크립트를 중단합니다. --isolated는 사용자 pip 설정과 환경 변수를 무시하며 --no-cache-dir은 캐시된 다운로드를 피합니다. --index-url과 --extra-index-url은 두 패키지 인덱스를 지정하고 -r은 요구 사항을 읽습니다.

bash install.sh .venv

이제 해당 환경의 인터프리터로 원본 호출 프로그램을 실행하세요.

.venv/bin/python quote.py orders.csv

T101은 잘못된 3600,36.00, T103은 1800,18.00입니다. 통제된 대체 패키지는 계산만 바꾸고 데이터를 훔치지 않습니다. 성공한 설치 종료만으로 정확한 가격이 입증되지는 않습니다.

해결기가 선택한 패키지 확인하기

잘못된 동작을 실제 설치 패키지와 연결합니다. 패키지 인덱스는 사용 가능한 배포판을 나열하고, wheel은 설치 가능한 Python 패키지 아카이브입니다.

python3 -m pip은 pip를 모듈로 실행합니다. show 명령은 --python으로 선택한 환경의 설치 메타데이터를 읽습니다.

python3 -m pip --isolated --python .venv show benchticket-prices benchticket-labels

prices는 benchticket-labels를 요구하는 9.0.0, labels는 1.0.0이어야 합니다. Labels는 간접 의존성입니다. prices를 설치하면서 pip가 함께 설치했습니다. 이 배포 이름의 하이픈은 가져오기 이름의 밑줄에 대응합니다.

독립적으로 제공된 승인 목록을 읽으세요.

cat /opt/labex-lookalike/approval/packages.tsv

승인 버전은 prices 1.4.0과 labels 1.0.0입니다. SHA-256 열은 다음 실습에서 사용합니다.

Pip는 두 인덱스를 모두 검색합니다. --extra-index-url은 우선순위가 낮은 예비 소스가 아닙니다. 여기서는 일치하는 더 높은 버전이 선택됩니다. 로컬 public 경로는 합성된 두 번째 소스로 실제 PyPI가 아닙니다. 이제 검토된 패키지 집합만 사용하도록 절차를 제한합니다.

승인된 설치 절차 저장하고 적용하기

승인 버전을 저장하고 승인 인덱스를 사용합니다. ==는 정확한 버전 요구입니다.

다음 here-document는 파일 전체를 씁니다. >는 지정 파일을 대체하며 <<'EOF'는 EOF만 있는 줄까지 다음 줄들을 그대로 읽습니다. 수정 가능한 두 설치 파일에만 사용하세요.

cat > requirements.txt <<'EOF'
benchticket-prices==1.4.0
benchticket-labels==1.0.0
EOF

환경 인수와 실패 시 중단을 유지하며 절차를 교체합니다. 승인 인덱스에는 필요한 두 패키지가 있습니다.

cat > install.sh <<'EOF'
#!/bin/bash
set -e
python3 -m pip --isolated --python "$1" install --no-cache-dir --index-url http://127.0.0.1:8123/approved/simple -r requirements.txt
EOF
bash install.sh .venv

Pip는 prices 9.0.0을 1.4.0으로 교체합니다. 설치 버전을 다시 읽으세요.

python3 -m pip --isolated --python .venv show benchticket-prices benchticket-labels

둘 다 목록과 일치해야 합니다. 경로를 잘못 입력했다면 cd /home/labex/project/ticket-build로 돌아와 cat으로 두 파일을 확인하고 설치를 반복하세요. VM 초기화는 필요 없습니다.

모든 주문의 올바른 가격 전달하기

실제 창구 가격표를 만듭니다. 준비된 호출 프로그램은 제공된 CSV를 읽고 설치 패키지의 함수를 호출하여 금액을 표시합니다. --output 옵션은 결과를 저장합니다.

.venv/bin/python quote.py orders.csv --output handover.csv
cat handover.csv

T101부터 T105의 합계는 3200, 1200, 1600, 0, 4200센트여야 합니다. ID, 수량, 회원 값은 올바른 주문과 연결되어야 합니다.

diff -u는 두 텍스트 파일을 비교하여 변경된 줄을 보여줍니다. 독립적으로 제공된 예제와 비교하세요.

diff -u /opt/labex-lookalike/approval/reference.csv handover.csv

출력이 없으면 일치합니다. $?는 바로 앞 명령의 종료 상태를 담습니다. 다른 명령이 바꾸기 전에 읽으세요.

echo $?

예상값은 0입니다. 차이는 1을 반환하며 파일 누락이나 Python 가져오기 오류와는 다릅니다. 설치 절차를 수정해 재설치한 뒤 프로그램을 다시 실행하세요. 주문을 편집하거나 가격표를 직접 입력하지 마세요.

첫 환경을 빌리지 않고 재구축하기

저장한 절차가 현재 설치와 독립적으로 작동하는지 확인합니다. 두 번째 가상 환경은 티켓 패키지 없이 시작합니다.

python3 -m venv --without-pip .rebuild

같은 절차에 다른 대상을 전달하세요.

bash install.sh .rebuild
.rebuild/bin/python quote.py orders.csv

동일한 다섯 개의 올바른 주문을 예상합니다. 원래 .venv, 저장된 handover.csv, 주문과 호출 프로그램은 유지됩니다.

이는 제공된 승인 소스에서 절차가 작동함을 입증합니다. 정확한 버전만으로 정확한 바이트가 정해지지는 않습니다. 다른 소스는 같은 이름과 버전으로 다른 wheel을 제공할 수 있습니다. 다음 독립 실습에서는 해시로 그 경계를 만듭니다.

이 실습은 합성된 통제 패키지 서버를 사용하며 운영용 비공개 인덱스가 아닙니다. 모든 소스를 닫거나 알려진 CSV를 복사하면 방금 입증한 유용한 재구축이 불가능해집니다.

요약

실제 티켓 가격을 비교하고 직접·간접 의존성을 확인한 뒤 저장한 절차로 승인 패키지 집합을 재구축했습니다. 원본 데이터와 앱을 바꾸지 않고 완전한 가격표도 전달했습니다. 패키지 선택 및 설치 성공은 업무 결과의 정확성과 각각 구분하여 판단해야 합니다.