if__name__=="main"

Tags: #troubleshooting, #__main__, #__name__, #scripting Solves Issue

Description

졜근 Python3λ₯Ό ν™œμš©ν•˜μ—¬ 슀크립트λ₯Ό μž‘μ„±ν•˜κ³ μžˆλ‹€. μ—¬κΈ°μ—” 2κ°€μ§€ μ΄μœ κ°€ μžˆλŠ”λ° λ¨Όμ € Python3 μ‚¬μš©μ— μ΅μˆ™ν•΄μ§€κΈ° μœ„ν•΄μ„œ, 그리고 ν‰μ†Œμ— 자주 μ‚¬μš©ν•˜λŠ” μ»€λ§¨λ“œ 등을 슀크립트둜 μžλ™ν™”ν•˜μ—¬ νš¨μœ¨μ„ 높이기 μœ„ν•΄μ„œλ‹€. 특히 κ³΅λΆ€ν•˜λŠ” μž…μž₯μ—μ„œ Docker μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‚­μ œν•˜λŠ” 상황은 ꡉμž₯히 많이 λ°œμƒν•œλ‹€. 과거에 Docker μ‹€μŠ΅, ν˜Ήμ€ ν”„λ‘œμ νŠΈ μˆ˜ν–‰ κ³Όμ •μ—μ„œ μ‹€ν–‰λœ μ»¨ν…Œμ΄λ„ˆ 쀑 ν˜„μž¬μ—λŠ” μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 것듀도 많기 λ•Œλ¬Έμ΄λ‹€.

이 경우 자주 인터넷 λΈ”λ‘œκ·Έμ—μ„œ 'λͺ¨λ“  도컀 μ»¨ν…Œμ΄λ„ˆ μ‚­μ œ' ν˜Ήμ€ 'λͺ¨λ“  도컀 μ»¨ν…Œμ΄λ„ˆ 이미지 μ‚­μ œ' 등을 κ²€μƒ‰ν•˜κ±°λ‚˜ μœˆλ„μš° μŠ€ν‹°μ»€ λ©”λͺ¨ 등에 μ»€λ§¨λ“œ 등을 λ”°λ‘œ 기둝해두기도 ν•œλ‹€.

이젠 더 이상 λΈ”λ‘œκ·Έλ₯Ό 기웃거리지 μ•Šκ³ , 슀크립트 μž‘μ„± λŠ₯λ ₯도 κΈ°λ₯Ό κ²Έ Python3둜 λ°˜λ³΅ν•΄μ„œ μ‚¬μš©ν•˜λŠ” λͺ…λ Ήμ–΄ ν˜Ήμ€ μž‘μ—…μ„ 슀크립트둜 μž‘μ„±ν•˜κ³  Github에 κ³΅κ°œν•˜κΈ°λ‘œ ν–ˆλ‹€(λ ˆν¬μ§€ν† λ¦¬). μ΄λ²ˆμ— μž‘μ„±ν•œ μŠ€ν¬λ¦½νŠΈλŠ” λͺ¨λ“  도컀 μ»¨ν…Œμ΄λ„ˆ μ‚­μ œ 슀크립트 이닀. ν•„μš”ν•œ λ©”μ†Œλ“œλ“€μ„ κ²€μƒ‰ν•˜λ©° μ°¨κ·Όμ°¨κ·Ό μ§„ν–‰ν•˜λ˜ 쀑 ν…ŒμŠ€νŠΈ κ³Όμ •μ—μ„œ ν•œ κ°€μ§€ λ¬Έμ œκ°€ λ°œμƒν–ˆλ‹€. pytest -v λͺ…λ Ήμ–΄λ₯Ό 톡해 ν…ŒμŠ€νŠΈ μˆ˜ν–‰ 쀑 λ‹€μŒκ³Ό 같은 였λ₯˜ λ©”μ‹œμ§€κ°€ λ°œμƒν–ˆλ‹€.

========================================================== ERRORS ==========================================================
__________________________________ ERROR collecting remove_all_docker_containers_test.py ___________________________________
remove_all_docker_containers_test.py:5: in <module>
    from remove_all_docker_containers import remove_containers
remove_all_docker_containers.py:46: in <module>
    ask_user()
remove_all_docker_containers.py:36: in ask_user
    answer = input("Continue? (y/N)")
/usr/local/lib/python3.10/dist-packages/_pytest/capture.py:192: in read
    raise OSError(
E   OSError: pytest: reading from stdin while output is captured!  Consider using `-s`.
----------------------------------------------------- Captured stdout ------------------------------------------------------
All of your docker containers on your host will be removed.
Continue? (y/N)
================================================= short test summary info ==================================================
ERROR remove_all_docker_containers_test.py - OSError: pytest: reading from stdin while output is captured!  Consider usin...
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
===================================================== 1 error in 0.08s =====================================================

여기에 μ‚¬μš©ν•œ ν…ŒμŠ€νŠΈ μ½”λ“œμ˜ μ‹€ν–‰ μˆœμ„œλŠ” λ‹€μŒκ³Ό κ°™λ‹€.

  1. μž„μ‹œ μ»¨ν…Œμ΄λ„ˆ busybox μ‹€ν–‰(ν…ŒμŠ€νŠΈ λŒ€μƒ μ»¨ν…Œμ΄λ„ˆκ°€ μ—†μœΌλ©΄ μ•ˆλ˜λ―€λ‘œ)

  2. 'λͺ¨λ“  도컀 μ»¨ν…Œμ΄λ„ˆ μ‚­μ œ' ν•¨μˆ˜ μ‹€ν–‰

  3. 이후 ν•΄λ‹Ή ν˜ΈμŠ€νŠΈμ—μ„œ ν˜„μž¬ μ‹€ν–‰ 쀑인 μ»¨ν…Œμ΄λ„ˆμ˜ κ°―μˆ˜κ°€ 0이면 ν…ŒμŠ€νŠΈ 톡과, 0이 μ•„λ‹ˆλ©΄ ν…ŒμŠ€νŠΈ μ‹€νŒ¨

였λ₯˜ λ‚΄μš©μ„ μš”μ•½ν•΄λ³΄λ©΄ λ‹€μŒ 였λ₯˜κ°€ 핡심 λ¬Έκ΅¬μž„μ„ μ•Œ 수 μžˆλ‹€.

ν…ŒμŠ€νŠΈλ₯Ό μœ„ν•΄ 좜λ ₯이 μΊ‘μ³λ˜λŠ” 와쀑에 stdinμ—μ„œ μž…λ ₯을 λ°›κ³ μžˆλ‹€λŠ” 것이닀.

Troubleshooting

처음 이 였λ₯˜μ˜ λ°œμƒ 원인을 μƒκ°ν•΄λ³΄μ•˜μ„ 땐 pytest μžμ²΄μ— ν…ŒμŠ€νŠΈ λŒ€μƒ ν•¨μˆ˜ ν˜Ήμ€ ν…ŒμŠ€νŠΈ λŒ€μƒ ν•¨μˆ˜μ˜ μž‘λ™ μˆœμ„œ 등을 μ •ν•˜λŠ” λͺ…λ Ήμ–΄κ°€ 있으며, 이λ₯Ό ν•„νžˆ μ§€μ •ν•΄μ€˜μ•Ό 정상적인 ν…ŒμŠ€νŠΈκ°€ μ§„ν–‰λ˜λŠ” 쀄 μ•Œμ•˜λ‹€. μ™œλƒν–λ©΄ ν…ŒμŠ€νŠΈμ½”λ“œ μžμ²΄μ—μ„œ μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‚­μ œν•˜λŠ” ν•¨μˆ˜λ§Œμ„ λΆˆλŸ¬μ™”λŠ”λ° μ‚¬μš©μžμ—κ²Œ λͺ¨λ“  μ»¨ν…Œμ΄λ„ˆλ₯Ό 정말 μ‚­μ œν•  것인지 λ¬»λŠ” ask_user ν•¨μˆ˜κ°€ μ‹€ν–‰λ˜κ³  μžˆμ—ˆμœΌλ©°, 그둜 인해 λ¬Έμ œκ°€ λ°œμƒν–ˆκΈ° λ•Œλ¬Έμ΄λ‹€.

이λ₯Ό ν•΄κ²°ν•˜κΈ°μœ„ν•΄ κ΄€λ ¨ λ‚΄μš©μ„ 검색해보고, pytest tutorialμ—μ„œ μ˜ˆμ „μ— pytest μ‚¬μš©λ²•μ„ 곡뢀할 λ•Œ λ†“μΉœ 뢀뢄이 μžˆλ‚˜ μ‚΄νŽ΄λ³΄μ•˜λ‹€. μ‚΄νŽ΄λ³΄λŠ” κ³Όμ •μ—μ„œ Fixtureλ‚˜ Grouping the Tests λ“±μ˜ λ‚΄μš©μ€ μœ μš©ν•˜κ²Œ λ°°μ› μ§€λ§Œ, μ΄λŸ¬ν•œ λ‚΄μš©λ“€μ΄ λ°œμƒν•œ 문제의 해결책은 μ•„λ‹ˆμ—ˆλ‹€.

그러던 쀑 μ˜ˆμ „μ— Python3둜 μž‘μ„±λœ μ½”λ“œλ₯Ό μ‚΄νŽ΄λ³Ό λ•Œ if __name__ == '__main__'이 κ³΅ν†΅μ μœΌλ‘œ λ“€μ–΄κ°€μžˆλŠ” 것을 ν™•μΈν•˜, μ΄κ²ƒμ˜ 역할이 κΆκΈˆν•΄ κ²€μƒ‰ν•΄λ΄€λ˜ 기얡이 났닀. μœ„ μ½”λ“œμ™€ κ΄€λ ¨λœ λ‚΄μš©μ„ μ„€λͺ…ν•˜κ³  μžˆλŠ” 곡식 λ¬Έμ„œλ₯Ό μ°Ύμ•„λ³΄λ‹ˆ 핡심 역할은 λ‹€μŒκ³Ό κ°™μ•˜λ‹€.

  1. the name of the top-level environment of the program, which can be checked using the __name__ == '__main__' expression; and

  2. the __main__.py file in Python packages.

이 두 κ°€μ§€ μ„€λͺ…λ§ŒμœΌλ‘  μ‹€μ œλ‘œ μ–΄λ–€ 역할을 μˆ˜ν–‰ν•˜λŠ”μ§€ 감이 잘 μ˜€μ§€μ•ŠλŠ”λ‹€. 이후 μŠ€ν¬λ‘€μ„ λ‚΄λ €λ³΄λ‹ˆ Idiomatic Usage λΆ€λΆ„λΆ€ν„° ν•„μš”ν•œ λ‚΄μš©μ„ μ„€λͺ…ν•˜κ³  μžˆλ‹€. μ„€λͺ…에 μ‚¬μš©ν•œ μ˜ˆμ‹œ μƒν™©λ§ˆμ €λ„ μ§€κΈˆ μƒν™©μ²˜λŸΌ ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” κ³Όμ •μ—μ„œ λ°œμƒν•˜λŠ” μ˜λ„μΉ˜μ•Šμ€ μ½”λ“œ 싀행을 예둜 λ“€κ³ μžˆλ‹€. λ¬Έμ„œκ°€ μ„€λͺ…ν•˜κΈ°λ₯Ό μ™ΈλΆ€ νŒŒμΌλ‘œλΆ€ν„° ν˜ΈμΆœλ˜λŠ” 경우 싀행을 μ›μΉ˜ μ•ŠλŠ” μ½”λ“œλŠ” if __name__ == '__main__' μ½”λ“œ λ’€ 두어 νŽΈλ¦¬ν•˜κ²Œ 싀행을 λ°©μ§€ν•  수 μžˆλ‹€κ³  λ§ν•œλ‹€. 처음 μ–΄λ–€ κ°œλ…μ„ 곡뢀할 땐 곡식 λ¬Έμ„œκ°€ λ„ˆλ¬΄ λ§Žμ€ λ‚΄μš©λ“€μ„ μžμ„Ένžˆ λ‹€λ£¨κ³ μžˆμ–΄ 읽기 κΊΌλ €μ§€λŠ” μˆœκ°„μ΄ μžˆλ‹€. κ·ΈλŸ¬λ‚˜ ν˜„μž¬ μƒν™©μ²˜λŸΌ Troubleshooting이 ν•„μš”ν•  λ•Œ κ°€μž₯ μ •ν™•ν•œ 닡을 μ œκ³΅ν•˜λŠ” 것 λ˜ν•œ κ³΅μ‹λ¬Έμ„œμ΄λ‹€.

이번 Troubleshooting κ³Όμ •μ—μ„œ 또 ν•œ κ°€μ§€ μ•Œκ²Œλœ 것이 Python3의 경우 λ‹¨μˆœνžˆ μ™ΈλΆ€ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄ 호좜 λŒ€μƒ ν•¨μˆ˜ 외에도 ν•΄λ‹Ή νŒŒμΌμ„ 직접 μ‹€ν–‰ν•˜λŠ” 것 처럼 λ™μž‘ν•œλ‹€λŠ” 점이닀. 이λ₯Ό 사전에 μ•Œκ³ μžˆμ—ˆμœΌλ©΄ 수고λ₯Ό λœμ—ˆμ„ 텐데, ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” κ³Όμ •μ—μ„œ μ•Œκ²Œλλ‹€. 이런 상황을 λ§ˆμ£Όν•˜μ§€ λͺ»ν•΄ μ²˜μŒμ—” μ™œ 였λ₯˜κ°€ λ°œμƒν•˜λŠ” μ§€ μ΄ν•΄ν•˜μ§€ λͺ»ν–ˆλ‹€. λ˜ν•œ, μ΄λŸ¬ν•œ 상황을 λ§ˆμ£Όν•œμ μ΄ μ—†μœΌλ‹ˆ '__main__' λ₯Ό 처음 배울 λ•Œλ„ κ·Έ μ˜λ―Έλ‚˜ μš©λ„λ₯Ό μ œλŒ€λ‘œ νŒŒμ•…ν•˜μ§€ λͺ»ν–ˆλ‹€.

κ·ΈλŸ¬λ‚˜, ν…ŒμŠ€νŠΈ μ½”λ“œ μž‘μ„±κ³Όμ •μ—μ„œ μ΄λ ‡κ²Œ 직접 Troubleshooting을 μˆ˜ν–‰ν•˜κ³ λ‚˜λ‹ˆ if __name__ == '__main__'의 ν•„μš”μ„±κ³Ό μš©λ„λ₯Ό μ œλŒ€λ‘œ 깨우칠 수 μžˆμ—ˆλ‹€.

이후에 μ½”λ“œλ₯Ό μˆ˜μ •ν•˜κ³  pytest -vλ₯Ό 톡해 ν…ŒμŠ€νŠΈλ₯Ό λ‹€μ‹œ μˆ˜ν–‰ν•˜ λ‹€μŒ 처럼 정상적인 ν…ŒμŠ€νŠΈ κ²°κ³Όλ₯Ό 확인할 수 μžˆμ—ˆλ‹€.

μš”μ•½ 및 배운점

  1. Python3λŠ” μ™ΈλΆ€ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  경우, ν•΄λ‹Ή ν•¨μˆ˜κ°€ μ •μ˜λœ 파일 자체λ₯Ό μ‹€ν–‰ν•˜λŠ” 것과 같은 λ™μž‘μ„ μˆ˜ν–‰ν•œλ‹€.

  2. if __name__ == '__main__'은 직접 싀행될 λ•Œμ™€ μ™ΈλΆ€ 파일둜 호좜될 λ•Œμ˜ μž‘λ™ 방식을 κ΅¬λΆ„μ§“λŠ” 역할을 ν•œλ‹€.

  3. Troubleshooting이 ν•„μš”ν•  땐 곡식 λ¬Έμ„œλ₯Ό μ‚΄νŽ΄λ³΄μž.

Last updated