본문 바로가기
Python

distutils (파이썬 모듈 배포 패키지)

by yororing 2024. 6. 18.

00 개요 

  • 회사에서 코드분석 하는데 distutils 모듈이 나와서 이에 대해 알아보고자 정리함
  • NOTE: Python 3.12에서는 distutils 더 이상 사용 안 함 (removal, depricated) 

01 distutils 란

1. 정의

  • 'distribution utilities'
  • Python 설치 시 추가적인 모듈들을 build 및 install하는 데 도움을 주는 패키지
  • 새 모듈들은 100% Python 코드로 작성되었거나, C로 작성되었거나, Python 패키지 모음일 것

02 API Reference

 

1. distutils.core

  • Core Distutils 기능 포함
  • distutils.core 모듈만 설치되 Distutils 사용 가능

1) distutils.core.setup()

distutils.core.setup(arguments)

# 예시
setup(name='lsf-pythonapi', # setup(): 파이썬 패키지 구성, 배포하기 위한 함수
      version='1.0.6',
      description='Python binding for IBM Spectrum LSF APIs',
      long_description='Python binding for IBM Spectrum LSF APIs',
      license='EPL',
      keywords='LSF,Grid,Cluster,HPC',
      url='https://github.com/IBMSpectrumComputing/lsf-python-api',
      ext_package='pythonlsf',
      data_files=[('pythonlsf', ['LICENSE'])],
      ext_modules=[Extension('_lsf', ['pythonlsf/lsf.i'],   # Extension(): C/C++로 작성된 파이썬 확장 모듈 정의하기 위한 함수
                               include_dirs=['/usr/include/python2.4', inc_path],
                               library_dirs=[LSF_LIBDIR],
                               swig_opts=['-I' + LSF_LIBDIR + '/../../include/lsf/', 
                                       #   '-DLSF_SIMULATOR',
                                          '-DOS_HAS_THREAD -D_REENTRANT', 
                                            gccflag_keyvaluet, gccflag_lsfversion],
                               extra_compile_args=['-m64', # 64비트 실행 모드 (-m32, -mcpu 등이 있음)
                                    '-I' + LSF_LIBDIR + '/../../include/lsf/', 
                                    '-Wno-strict-prototypes', gccflag_keyvaluet,
                                    gccflag_lsfversion,
                                    '-DOS_HAS_THREAD -D_REENTRANT', #For multi-thread lib, lserrno
                                    '-Wp,-U_FORTIFY_SOURCE', #The flag needs -O option. Undefine it for warning.
                                    '-O0'], 
                               extra_link_args=['-m64'],
                               extra_objects=lsf_static_lib,
                               libraries=lsf_dynamic_lib)],
      py_modules=['pythonlsf.lsf'],
      cmdclass = { 'bdist_rpm': bdist_rpm_custom },
      classifiers=["Development Status :: 2 - Pre-Alpha", 
                     "License :: OSI Approved :: Eclipse Public License",
                     "Operating System :: OS Independent",
                     "Programming Language :: Python",
                     "Topic :: Internet",
                     "Topic :: Scientific/Engineering",
                     "Topic :: Software Development",
                     "Topic :: System :: Distributed Computing",
                     "Topic :: Utilities",
                     ],
     )
  • The basic do-everything function that does most everything you could ever ask for from a Distutils method
  • The setup function takes a large number of arguments:
argument value type
name 패키지 이름 str
version 패키지 버전 str
description 패키지에 관한 설명 한 줄 str
long_description 패키지에 관한 설명 더 길게 str
author 패키지 저자 str
author_email 패키지 저자의. 이메일 str
maintainer 현재 유지하고 있는 자 str
maintainer_email 현재 유지하고 있는 자의 이메일 str
url 패키지의 (홈페이지) url str
download_url 패키지의 다운로드 url str
packages distutils가 조작할 Python 패키지들의 목록 list of str
py_modules distutils가 조작할 Python 모듈들의 목록 list of str
scripts build되고 install될 standalone script 파일들의 목록 list of str
ext_modules build될 Python extension들의 목록 list of str
classifiers 패키지를 위한 classifier 목록* list of str
distclass 사용할 Distribution class  
script_name setup.py 스크립트의 이믈 (기본값 sys.argv[0]) str
script_args setup 스크립트에 supply될 arguments  
options setup 스크립트의 기본 옵션들  
license 패키지 라이선스 str
keywords Descriptive 메타-데이터 listof str or comma-separated str
platforms    
cmdclass Command subclass들의 command 이름들의 매핑 (a mapping of command names to Command subclasses) dict
data_files 설치할 파일들의 데이터를 담음 lsitlist
package_dir directory 이름이랑 매핑되는 패키지  dict
  • *classifier  종류 - 엄청 많음
    • Each project's maintainers provide PyPI with a list of "Trove classifiers" to categorize each release, describing who it's forwhat systems it can run on, and how mature it is
    • These standardized classifiers can then be used by community members to find projects based on their desired criteria
    • Instructions for how to add Trove classifiers to a project can be found on the Python Packaging User Guide. To read the original classifier specification, refer to PEP 301. 
    • To prevent a package from being uploaded to PyPI, use the special "Private :: Do Not Upload" classifier. PyPI will always reject packages with classifiers beginning with "Private ::".

1) distutils.core.Extension

  • The Extension class describes a single C/C++ extension module in a setup script
  • It accepts the following keyword arguments in its constructor:
argument value type
name extension의 full name (파일명이나 경로명이 아닌 Python dotted 이름) str
sources C, C++, SWIG (.i) 또는 플랫폼-specific 자원들로 이루어진 소스 파일 이름 목록 list of str
include_dirs C / C++ header file들을 검색할 디렉토리 리스트 list of str
library_dirs link time에 C / C++ 라이브러리들을 검색할 디렉토리 리스트 list of str
libraries list of library names (not filenames or paths) to link against list of str
swig_opts swig 옵션들 list of str
extra_compile_args any extra platform- and compiler-specific information to use when compiling the source files in ‘sources’
For platforms and compilers where a command line makes sense, this is typically a list of command-line arguments, but for other platforms it could be anything.
list of str
extra_link_args any extra platform- and compiler-specific information to use when linking object files together to create the extension (or to create a new static Python interpreter)
Similar interpretation as for ‘extra_compile_args’.
list of str
extra_objects list of extra files to link with
예) object files not implied by ‘sources’, static library that must be explicitly specified, binary resource files, etc.
list of str
language extension language (i.e., 'c', 'c++', 'objc')
will be detected from the source extensions if not a string procided
 

2. distutils.command

  • individual distutils command

1) distutils.command.bdist_rpm

  • Redhat RPM과 SRPM으로 바이너리 배포를 build

2) distutils.command.bdist_wininst

  • Windows installer를 build

3) distutils.command.build_clib

  • 패키지 안에 있는 어느 C 라이브러리를 build

4) distutils.command.build_py

  • 패키지의 .py/.pyc 파일들을 build 

참조

  1. https://docs.python.org/2.7/distutils/apiref.html 
  2. https://docs.python.org/3.6/distutils/apiref.html#module-distutils.command.bdist_rpm
  3. (classifier 종류) https://pypi.org/classifiers/
  4.