[Python] requirements.txt 또는 setup.py에서 조건 정보에 따른 모듈 설치 Develop Tip

오랫만에 파이썬 관련 정보를 올립니다.

다름이 아니라, 어떤 파이썬 모듈을 작성하는데,
보통은 Windows, Linux, Mac 등에 모두 동작하는 
파이썬 모듈을 작성합니다.
(파이썬 인터프리터가 시스템 의존적인 정보를 모두 은닉하고
 있기 때문에 가능한 일이지요)

그런데 때로는 이러한 정보가 특정 파이썬 버전 혹은, 시스템 플랫폼에 따라 
조건적으로 의존 패키지를 설치할 필요가 생깁니다.

한 예로, 시스템의 모니터 정보를 구해오는 

보통 이런 시스템 정보는 OS 에 따라서 각기 드라이버 등등
구해오는 방법이 다르기 때문에 플랫폼에 따라 서로 
다른 의존 패키지를 설치해야 합니다.

위의 screeninfo 의 설치파일인 setup.py 의 소스를 보면,

from setuptools import setup
setup(
    name="screeninfo",
    packages=["screeninfo", "screeninfo.enumerators"],
    version="0.6.5",
    description="Fetch location and size of physical screens.",
    author="rr-",
    author_email="rr-@sakuya.pl",
    url="https://github.com/rr-/screeninfo",
    keywords=["screen", "monitor", "desktop"],
    classifiers=[],
    install_requires=[
        "dataclasses ; python_version<'3.7'",
        'Cython ; sys_platform=="darwin"',
        'pyobjus ; sys_platform=="darwin"',
    ],
)

와 같이 있는데,
install_requires 리스트 부분을 주목합니다.

각각 문자열 상수로

dataclasses ; python_version<'3.7'
라는 것은 파이썬 3.7 이전 버전이라면, dataclasses 모듈을 설치하라는 의미이고,

Cython ; sys_platform=="darwin"
라는 것은 sys_platform 이 darwin, 즉 Mac 이면 Cython 이라는 모듈을 설치하라는 것입니다.

pyobjus 라는 모듈설치도 맥인 경우에만 하게 되겠네요.

그런데 이런 기술은 setup 함수의 install_requires 목록에서 뿐만 아니라, 
requirements.txt 에서도 동일하게 기술 가능합니다.

예를 들어,

futures>=3.0.5; python_version < '3.0'
futures>=3.0.5; python_version == '2.6' or python_version=='2.7'
futures>3 ; python_version >= "3.6" and sys_platform == "linux"
futures>3.3 ; python_version >= "3.6" and sys_platform == "darwin"

라고 기술하면, 파이썬 버전이 2.6 또는 2.7 그리고 3.0 보다 적으면 futures 3.0.5 버전을 설치하고,
리눅스이고 파이썬 버전이 3.6 이상이면 futures 3 보다 큰 버전을 설치하고,
맥이고 파이썬 3.6 버전 이상이면 futures 3.3 보다 큰 버전을 설치하라는 의미입니다.

즉, 세미콜론으로 구분된 조건식을 추가하고 and 또는 or로 구분되어 파이썬버전(python_version) 이나
시스템 플랫폼 (sys_platform) 으로 제약사항을 기술하면 됩니다.

또 setup.py 에서 특정 requirements.txt 를 읽어 setup.py의 install_requires 를 지정하는 방법이 있는데,

from setuptools import setup
try: # for pip >= 10
    from pip._internal.req import parse_requirements
    from pip._internal.download import PipSession
except ImportError: # for pip <= 9.0.3
    from pip.req import parse_requirements
    from pip.download import PipSession
################################################################################
# parse_requirements() returns generator of pip.req.InstallRequirement objects
install_reqs = parse_requirements("{requirements_txt}", session=PipSession())
reqs = [str(ir.req) for ir in install_reqs]
setup(
    ...
    install_requires=reqs,
)

와 같은 식으로 지정하면 됩니다.


어느 분께는 도움이 되셨기를 ..





덧글

댓글 입력 영역

구글애드텍스트