λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Python/ETC

[개발둜그 Python] κ°€μƒν™˜κ²½ venv μ‚¬μš©ν•΄μ„œ μ—¬λŸ¬ ν˜•μƒ μ‚¬μš©(intellij)

by πŸŒ»β™š 2021. 6. 15.

κ°€μƒν™˜κ²½μ€ μ™œ μ‚¬μš©ν• κΉŒ?

νšŒμ‚¬λ‚΄μ— Python을 μ΄μš©ν•œ ν”„λ‘œμ νŠΈκ°€ λ§ŽμŠ΅λ‹ˆλ‹€. 2. λŒ€ 버전을 μ‚¬μš©ν•˜λŠ” ν”„λ‘œμ νŠΈλ„ 있고 3. λŒ€ 버전을 μ‚¬μš©ν•˜λŠ” ν”„λ‘œμ νŠΈλ„ μžˆμŠ΅λ‹ˆλ‹€. λ§Œμ•½ 각 ν”„λ‘œμ νŠΈκ°€ κ°œλ³„μ μœΌλ‘œ μ„œλ‘œ ν•˜λ‚˜μ˜ μ„œλ²„λ₯Ό μ‚¬μš©ν•΄μ„œ μ„œλΉ„μŠ€λ˜κ³  μžˆλ‹€λ©΄ μ„€μΉ˜λœ Python 인터프리터 ν•˜λ‚˜λ§Œ μ‚¬μš©ν•΄λ„ 되기 λ•Œλ¬Έμ— 큰 λ¬Έμ œκ°€ 없을 것 μž…λ‹ˆλ‹€. 그런데 λ§Œμ•½ ν•˜λ‚˜μ˜ μ„œλ²„μ— μ—¬λŸ¬ ν”„λ‘œμ νŠΈκ°€ μ„œλΉ„μŠ€λ˜κ³  있고 μ„€μΉ˜λœ Python μΈν„°ν”„λ¦¬ν„°λ§Œ μ‚¬μš©ν•˜λ©΄ μ–΄λ–€ λ¬Έμ œκ°€ λ°œμƒν• κΉŒμš”?

 

3가지 ν”„λ‘œμ νŠΈκ°€ ν•˜λ‚˜μ˜ μ„œλ²„μ—μ„œ 운영되고 μžˆλŠ” 경우... Project3의 경우 3.8 버전을 μ‚¬μš©ν•˜λŠ” ν”„λ‘œμ νŠΈλŠ” ν•˜λ‚˜λ°–μ— μ—†κΈ° λ•Œλ¬Έμ— ν˜„μž¬μ˜ μ‹œμ μ—μ„œλŠ” λ¬Έμ œκ°€ μ—†μ§€λ§Œ... Python 3.9 버전을 μ‚¬μš©ν•˜λŠ” Project1κ³Ό Project2의 경우 ν˜Έν™˜μ„± λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. Project1μ—μ„œ λ¨Όμ € Package C 1.5.5 버전을 μ„€μΉ˜ν•˜κ³  Project2κ°€ κ°œλ°œλ˜λ©΄μ„œ Package C 2.2.1 λ²„μ „μœΌλ‘œ κ°œλ°œλ˜μ—ˆλ‹€κ³  κ°€μ •ν•˜κ² μŠ΅λ‹ˆλ‹€. Project2κ°€ μ„œλΉ„μŠ€λ˜λ©΄μ„œ Package Cλ₯Ό 1.5.5 --> 2.2.1 λ²„μ „μœΌλ‘œ μ—…κ·Έλ ˆμ΄λ“œλ₯Ό ν•΄λ²„λ ΈμŠ΅λ‹ˆλ‹€. 이 λ•Œ Project1이 κ°‘μžκΈ° λ¬Έμ œκ°€ 생기고 μ •μƒμž‘λ™ν•˜μ§€ μ•Šμ„ 수 μžˆμŠ΅λ‹ˆλ‹€. Package Cκ°€ μ—…κ·Έλ ˆμ΄λ“œλ˜λ©΄μ„œ μƒˆλ‘œμš΄ 멀버가 μΆ”κ°€λ˜κ±°λ‚˜ μ‚­μ œλ˜μ–΄μ„œ ν˜Έν™˜μ΄ μ•ˆλ˜λŠ” 것 일 μˆ˜λ„ 있고... PackageA와 B에 Package Cκ°€ μ’…μ†λ˜μ–΄ μš”κ΅¬ν•˜λŠ” 버전이 λ‹¬λΌμ„œ 그럴 μˆ˜λ„ 있고... 이처럼 ν˜Έν™˜μ— λŒ€ν•œ λ¬Έμ œκ°€ λ°œμƒν–ˆμ„ λ•Œ μΆ”μ ν•˜κΈ°κ°€ 생각보닀 μ–΄λ ΅μŠ΅λ‹ˆλ‹€.

 

 μ΄λŸ° 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ κ°€μƒν™˜κ²½μ„ μ‚¬μš©ν•΄μ„œ ν”„λ‘œμ νŠΈλ³„λ‘œ μ‚¬μš©ν•˜λŠ” 인터프리터와 νŒ¨ν‚€μ§€μ˜ 곡간을 뢄리할 수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

κ°€μƒν™˜κ²½ λ§Œλ“€κΈ°

μ˜ˆμ œλŠ” Mac, Linuxμ—μ„œ 진행
# κ°€μƒν™˜κ²½μ„ μ‚¬μš©ν•  ν”„λ‘œμ νŠΈ 디렉토리 생성
$ mkdir project1

# κ°€μƒν™˜κ²½ 생성
$ python3.9 -m venv project1/.venv
# κ°€μƒν™˜κ²½ μ‹€ν–‰
$ source project1/.venv/bin/activate

# python3.9λ₯Ό μ‚¬μš©ν•˜λŠ” 것 확인
(.venv) $ python -V
Python 3.9.5

# κ°€μƒν™˜κ²½μ—μ„œ νŒ¨ν‚€μ§€ μ„€μΉ˜
(.venv) $ pip install pytest
(.venv) $ pip show pytest
Name: pytest
Version: 6.2.4
Summary: pytest: simple powerful testing with Python
Home-page: https://docs.pytest.org/en/latest/
Author: Holger Krekel, Bruno Oliveira, Ronny Pfannschmidt, Floris Bruynooghe, Brianna Laugher, Florian Bruhin and others
Author-email: None
License: MIT
Location: /Users/Jamong/workspace/project1/.venv/lib/python3.9/site-packages
Requires: packaging, attrs, pluggy, toml, iniconfig, py
Required-by: 

# κ°€μƒν™˜κ²½ λΉ μ Έλ‚˜κ°€κΈ°
(.venv) $ deactivate

python2 λ²„μ „μ—μ„œλŠ” virtualenvλΌλŠ” μ™ΈλΆ€ νŒ¨ν‚€μ§€λ₯Ό μ‚¬μš©ν•΄μ„œ κ°€μƒν™˜κ²½μ„ μƒμ„±ν–ˆλŠ”λ°... python 3.3λΆ€ν„°λŠ” venvλͺ¨λ“ˆμ΄ λ‚΄μž₯λ˜μ–΄ μžˆμ–΄ λ³„λ„μ˜ μ„€μΉ˜ 없이 κ°€μƒν™˜κ²½μ„ 생성할 수 μžˆμŠ΅λ‹ˆλ‹€. μœ„ μ˜ˆμ œμ—μ„œλŠ” κ°€μƒν™˜κ²½ python3.9 인터프리터와 venv λͺ¨λ“ˆμ„ μ΄μš©ν•΄μ„œ κ°€μƒν™˜κ²½ μƒμ„±ν•˜κ³  μ‹€ν–‰ν•΄μ„œ pipλ₯Ό μ΄μš©ν•΄μ„œ pytest νŒ¨ν‚€μ§€λ₯Ό μ„€μΉ˜ ν–ˆμŠ΅λ‹ˆλ‹€. pytest 6.2.4 버전은 ν•΄λ‹Ή 가상 ν™˜κ²½μ—μ„œλ§Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

$ pip3.9 show pytest
WARNING: Package(s) not found: pytest

가상 ν™˜κ²½μ„ λΉ μ Έλ‚˜μ˜¨ 뒀에 μ΄ˆκΈ°μ— μ„€μΉ˜λœ python3.9와 μ—°κ²°λœ pipλ₯Ό 톡해 pytestκ°€ μ„€μΉ˜λ˜μ–΄ μžˆλŠ”μ§€ 확인해보면... μ—†λ‹€λŠ” κ²½κ³ λ₯Ό 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. 이처럼 ν™˜κ²½μ„ λΆ„λ¦¬ν•΄μ„œ μ‚¬μš©ν•˜μ—¬ μ˜μ‘΄μ„±, ν˜Έν™˜μ„± 문제λ₯Ό ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

κ°€μƒν™˜κ²½μœΌλ‘œ Python Script 싀행은 μ–΄λ–»κ²Œ ν• κΉŒμš”?

κ°€μƒν™˜κ²½μ„ μ™œ μ‚¬μš©ν•˜κ³  μ–΄λ–»κ²Œ μƒμ„±ν•˜λŠ”μ§€ μ•Œμ•„λ΄€λŠ”λ°... 그럼 이 κ°€μƒν™˜κ²½μ„ μ–΄λ–»κ²Œ μ΄μš©ν• κΉŒμš”? 2가지 κ΄€μ μ—μ„œ λ³΄κ² μŠ΅λ‹ˆλ‹€. 첫번 μ§ΈλŠ” python λͺ…령을 μ‚¬μš©ν•΄μ„œ μ‹€ν–‰ν•˜λŠ” 방법과 IDE μ—λ””ν„°μ—μ„œ μ‚¬μš©ν•˜λŠ” 방법 μž…λ‹ˆλ‹€.

 

κ°€μƒν™˜κ²½μœΌλ‘œ Python Script μ‹€ν–‰

 

test.py

import pytest

 

$ python3.9 test.py 
Traceback (most recent call last):
  File "test.py", line 1, in <module>
    import pytest
ImportError: No module named pytest

python scriptλ₯Ό μ‹€ν–‰ν•  λ•Œ... python λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•΄μ„œ μ‹€ν–‰ν–ˆμ—ˆλŠ”λ°... 이게 μ„€μΉ˜λœ 인터프리터λ₯Ό μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— module이 μ—†λ‹€λŠ” 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€. scriptμ—μ„œ κ°€μƒν™˜κ²½μ˜ python 인터프리터λ₯Ό μ‚¬μš©ν•˜λ €λ©΄ shebang을 μ‚¬μš©ν•˜κ±°λ‚˜ κ°€μƒν™˜κ²½μ˜ 인터프리터λ₯Ό 직접 μ‚¬μš©ν•΄μ„œ μ‹€ν–‰ ν•˜λ©΄ λ©λ‹ˆλ‹€.

 

κ°€μƒν™˜κ²½ 인터프리터 직접 μ‹€ν–‰

$ /Users/Jamong/workspace/project1/.venv/bin/python test.py 

 

shebang μ‚¬μš©

test.py

#! /Users/Jamong/workspace/project1/.venv/bin/python
import pytest

 

$ chmod 755 test.py
$ ./test.py

 

Intellij κ°€μƒν™˜κ²½ μ‚¬μš©

Intellijμ—μ„œ Python을 λΉ„λ‘―ν•˜μ—¬ Python의 κ°€μƒν™˜κ²½μ„ μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œ Plugin이 μ„€μΉ˜λ˜μ–΄ μžˆμ–΄μ•Όν•©λ‹ˆλ‹€.

 

μœ„μ˜ μ˜ˆμ œμ—μ„œ κ°€μƒν™˜κ²½μ„ μƒμ„±ν•œ ν”„λ‘œμ νŠΈλ₯Ό μ—΄μ–΄μ€λ‹ˆλ‹€.

 

Project Structureλ₯Ό μ—΄μ–΄μ€λ‹ˆλ‹€.

 

SDKs νƒ­μ—μ„œ Python SDKλ₯Ό μΆ”κ°€ν•΄μ€„κ²λ‹ˆλ‹€.

 

IDEμ—μ„œ κ°€μƒν™˜κ²½μ„ μƒˆλ‘­κ²Œ μƒμ„±ν•˜κ³  ν”„λ‘œμ νŠΈλ₯Ό 진행할 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. ν•΄λ‹Ή κΈ€μ—μ„œλŠ” μœ„μ—μ„œ μƒμ„±ν•œ κ°€μƒν™˜κ²½μ΄ 있기 λ•Œλ¬Έμ— κ°€μƒν™©κ²½μ˜ 인터프리터λ₯Ό μ§€μ •ν•΄μ€λ‹ˆλ‹€.

 

μΆ”κ°€ν•΄μ£Όλ©΄ ν•΄λ‹Ή SDKλ₯Ό 선택해주고 packages 탭을 클릭해보면 ν˜„μž¬ μ„€μΉ˜λ˜μ–΄ μžˆλŠ” νŒ¨ν‚€μ§€λ“€μ„ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. 이전에 μ„€μΉ˜ν•œ pytest λͺ¨λ“ˆλ„ μžˆλŠ” 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. "+" λͺ¨μ–‘ λ²„νŠΌμ„ ν΄λ¦­ν•˜λ©΄ IDEμΈν„°νŽ˜μ΄μŠ€μ—μ„œ νŒ¨ν‚€μ§€λ“€μ„ κ²€μƒ‰ν•΄μ„œ μ„€μΉ˜ν• μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

 

IDEμ—μ„œ κ²€μƒ‰ν•΄μ„œ νŒ¨ν‚€μ§€λ₯Ό μ„€μΉ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

Project νƒ­μ—μ„œ μΆ”κ°€ν•œ SDKλ₯Ό μ„€μ •ν•˜κ³  μ μš©ν•΄μ£Όλ©΄ μ™„λ£Œμž…λ‹ˆλ‹€.

 

test.py

import pytest

IDEμ—μ„œ μ‹€ν–‰μ‹œμΌœμ£Όλ©΄ 이상없이 λͺ¨λ“ˆμ„ λ°›μ•„μ˜€λŠ” 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

정리

  • Python κ°€μƒν™˜κ²½μ€ 각 ν”„λ‘œμ νŠΈλ₯Ό κ°œλ³„μ μœΌλ‘œ κ΄€λ¦¬ν•˜μ—¬ νŒ¨ν‚€μ§€μ— λŒ€ν•œ ν˜Έν™˜μ„± 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λœλ‹€.
  • Python 3.3 λΆ€ν„°λŠ” λ‚΄μž₯λ˜μ–΄ μžˆλŠ” λͺ¨λ“ˆ venvλ₯Ό μ‚¬μš©ν•΄μ„œ κ°€μƒν™˜κ²½μ„ 생성할 수 μžˆλ‹€.
  • Shebang을 μ΄μš©ν•˜κ±°λ‚˜ κ°€μƒν™˜κ²½μ˜ 인터프리터λ₯Ό 직접 μ‚¬μš©ν•΄μ„œ Python Scriptλ₯Ό μ‹€ν–‰ν•  수 μžˆλ‹€.
  • IDEμ—μ„œλ„ ν”ŒλŸ¬κ·ΈμΈμ„ μ‚¬μš©ν•΄μ„œ κ°€μƒν™˜κ²½μ„ μ‚¬μš©ν•  수 μžˆλ‹€.

λŒ“κΈ€