ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • PYPI
    저장소/PYPI 2016. 5. 21. 12:40

    PYPI는Python Packagy Index의 줄임말입니다. PYPI는 간단하게 파이썬 관련 패키지들이 모여있는 저장소라고 할 수 있습니다. 파이썬 개발자들은 자신이 개발한 파이썬 모듈들을 PYPI에 업로드할 수 있습니다. 또한 PYPI에 저장된 이 모듈들은 누구에게나 공개되어 있습니다. 여기서는 PYPI를 private하게 구축하는 방법을 설명하겠습니다.


    PYPI 설치


    아래명령어로 pypi 이미지를 다운받습니다.

    $ docker pull codekoala/pypi

    Usage

    sudo mkdir -p /srv/pypi             # 패키지를 담는 디렉토리를 로컬에 생성합니다.
    sudo touch /srv/pypi/.htaccess      # 패키지를 추가하기 위한 credential 파일
    docker run -t -i -d \               
        -h pypi.local \                 # hostname
        -v /srv/pypi:/srv/pypi:rw \     # 볼륨을 설정해 호스트 디렉토리를 pypi 컨테이너와 공유합니다. :rw로 읽기와쓰기 설정을 해줍니다.
        -p 8080:80 \                    # expose port 80 as port 8080
        --name pypi \                   # 컨테이너 이름
        codekoala/pypi                  # 

    먼저 mkdir의 옵션인 -p는 상위 디렉토리를 포함한 디렉토리를 생성할 수 있습니다. 위의 명령어처럼 -p /srv/pypi를 실행하면 /srv 디렉토리를 생성한 후, /srv 디렉토리내에 pypi 디렉토리를 생성합니다.

    다음 touch는 파일의 날짜시간정보를 변경하는 명령어입니다. 아무런 옵션이 없으므로, 파일의 최근 사용시간과 최근 변경된 시간을 서버의 현재시간으로 변경하고 파일의 크기가 0인 빈 파일을 생성합니다.


    위 처럼 세팅을 한 이유는 아래의 Dockerfile 내용으로 확인할 수 있습니다.

    FROM codekoala/saltyarch
    MAINTAINER Josh VanderLinden <codekoala@gmail.com>
    
    RUN pacman -Sy --noconfirm --needed python-pip python-passlib && pip install -U pypiserver && mkdir -p /srv/pypi && rm -rf /var/cache/pacman/*
    
    EXPOSE 80
    VOLUME ["/srv/pypi"]
    
    CMD ["pypi-server", "-p", "80", "-P", "/srv/pypi/.htaccess", "/srv/pypi"]


    실행되었을 시, http://localhost:8080으로 접속해 pypi 서버를 확인할 수 있습니다.  .tar, .zip, .egg 등 단순하게 추가할 수 있고 /srv/pypi디렉토리에 저장이 됩니다

    public pypi 패키지 및 모듈 private pypi에 업로드


    pypi는 흔히 사용하는 pip에 존재하는 패키지 및 모듈들을 저장하고 있습니다. 현재까지 조사한 바로는 pypi끼리 패키지 전체를 전송하는 방법은 찾지 못했습니다. 약간의 수작업을 통해 전체 파일을 다운로드받을 수 있는 방법을 찾았습니다.

    먼저 pypi에 올라와 있는 패키지는 74594개 입니다.  먼저 위와 같이 세팅이 잘 되어 있다면, /srv/pypi의 폴더는 컨테이너와 공유가 되어 있는 상태입니다.

    아래의 명령어로 pypi의 패키지 목록을 받습니다.

    $ wget https://pypi.python.org/simple/

    그럼 index.html파일이 생성이 되고 아래와 같이 열어 확인을 하면 다음과 같은 형식으로 구성되어 있습니다.

    $ vi index.html
     
    <html><head><title>Simple Index</title><meta name="api-version" value="2" /></head><body>
    <a href='0-.-.-.-.-.-.-.-.-.-.-.-.-0'>0-._.-._.-._.-._.-._.-._.-0</a><br/>
    <a href='00smalinux'>00SMALINUX</a><br/>
    <a href='02exercicio'>02exercicio</a><br/>
    <a href='0805nexter'>0805nexter</a><br/>
    <a href='0x10c-asm'>0x10c-asm</a><br/>
    <a href='1020-nester'>1020-nester</a><br/>
    <a href='115wangpan'>115wangpan</a><br/>
    <a href='131228-pytest-1'>131228_pytest_1</a><br/>
    <a href='1337'>1337</a><br/>
    <a href='17monip'>17MonIP</a><br/>
    <a href='18-e'>18-e</a><br/>
    <a href='199fix'>199Fix</a><br/>
    ...

    이러한 형식으로 75000여개의 라인을 형성하고 있습니다. 여기서 필요한 것은 href= 안에 있는 패키지 이름입니다. 이 패키지 이름으로 아래와 같이 실행하면 다음과 같은 json 파일을 볼 수 있습니다.

    $ sudo wget https://pypi.python.org/pypi/roundup/json
    $ vi json
    {
        "info": {
            "maintainer": null,
            "docs_url": null,
            "requires_python": null,
            "maintainer_email": null,
            "cheesecake_code_kwalitee_id": null,
            "keywords": null,
            "package_url": "http://pypi.python.org/pypi/roundup",
            "author": "Ralf Schlatterbeck",
            "author_email": "rsc@runtux.com",
            "download_url": "http://pypi.python.org/pypi/roundup",
    
    
    ...
     "urls": [
            {
                "has_sig": true,
                "upload_time": "2016-01-11T21:38:39",
                "comment_text": "",
                "python_version": "source",
                "url": "https://pypi.python.org/packages/source/r/roundup/roundup-1.5.1.tar.gz",
                "md5_digest": "54b21d185dd490ef8697f5a046607a44",
                "downloads": 384,
                "filename": "roundup-1.5.1.tar.gz",
                "packagetype": "sdist",
                "path": "source/r/roundup/roundup-1.5.1.tar.gz",
                "size": 2618886
            }
    }

    이와 같은 패턴을 사용하여 php나 파이썬 등을 작성해 만들 수 있습니다.


    받은 압축파일 및 whl 파일들은 해당 서버에 직접 접근하여 /srv/pypi에 올리면 pypi서버에 반영이 됩니다.

    개인 프로젝트 private pypi서버에 업로드


    관리자

    관리자는 다음과 같이 사용자의 비밀번호와 아이디를 정의합니다.

    $ htpasswd -s htaccess yourusername
     
    만약 htpasswd 명령어가 설치가 안되어 있을 경우,
     
    http://www.htaccesstools.com/htpasswd-generator/ 해당 url로 들어가 사용자의 아이디와 비밀번호를 입력하고 나온 결과를 복사합니다.

    복사한 결과를 아래 파일을 열어 붙여 넣고 저장합니다.


    $ cd /srv/pypi
    $ sudo vi .htaccess
     
     
    복사내용 붙여넣기

    사용자

    아래에서는 test_sum이라는 파이썬 파일을 private 저장소 pypi에 업로드하는 방법을 설명합니다.


    배포(업로드)하고자 하는 파일이 아래와 같이 있다고 가정합니다.

    def sum(a, b):
        return a + b
    


    다음 같은 폴더 안에 setup.py 파일을 만들고 메타데이터를 작성합니다.

    setup (
            name               = 'factorial', 
            version             = '1.0.0',
            py_modules      = ['factorial'], //name과 py_modules 는 동일한 이름이여야 합니다.
            author              = 'ksw',
            author_email     = 'ksw@ksw.com',
            description        = 'factorial method',
        )


    윈도우와 리눅스는 파일 설정 및 지정이 다르기 때문에 나눠서 설명하겠습니다.

    윈도우

    메모장을 열어 아래의 코드를 붙여넣습니다.

    [distutils]
    index-servers =
        pypi
        internal
    
    [pypi]
    username:pypiusername
    password:pypipassword
    
    [internal]
    repository: http://10.101.30.124:8080 // private 저장소 url을 적습니다.
    username:duzon // 관리자가 할당해준 아이디를 적습니다.
    password:duzon // 관리자가 할당해준 비밀번호를 적습니다.

    .pypirc로 저장하고 C:\Users\(로그인된 사용자 아이디) 에 저장합니다. 

    예) C:\Users\ljh 에 저장

    리눅스

    아래와 같이 이동한 다음 .pypirc 파일을 작성 후 저장합니다.

    $ cd ~/
    # sudo vi .pypirc
     
     [distutils]
    index-servers =
        pypi
        internal
    
    [pypi]
    username:pypiusername
    password:pypipassword
    
    [internal]
    repository: http://10.101.30.124:8080 // private 저장소 url을 적습니다.
    username:duzon // 관리자가 할당해준 아이디를 적습니다.
    password:duzon // 관리자가 할당해준 비밀번호를 적습니다.



    위와 같이 저장한 다음 아래의 명령어로 pypi 서버에 파일을 배포(업로드)합니다.

    업로드할 시, 위에서 만들었던 setup.py 파일이 있는 경로에서 실행해야 합니다.

    $ python setup.py sdist register -r internal upload -r internal

    위의 방식은 .tar로 생성하여 올리기 때문에 python3에서만 사용이 가능합니다. python 2나 3 두 버전에서 사용가능한 wheel 타입으로 같이 올리는 방법이 가장 좋습니다.

    PIP Config 설정

    Mac

    터미널에 접근해주세요.


    $ mkdir $HOME/.pip
    $ vi $HOME/.pip/pip.conf


    [install]
    index-url=http://172.16.114.36/simple
    trusted-host=172.16.114.36 


    Window

    %HOME%\pip\pip.ini

    위의 경로에 파일을 생성해주세요. 그리고 아래의 내용을 채워주시기 바랍니다.


    [install]
    index-url=http://172.16.114.36/simple
    trusted-host=172.16.114.36 

    wheel 타입 압축 후 업로드

    wheel 타입으로 압축을 하기 위해선 먼저 wheel 모듈이 필요합니다. 

    $ pip3 install wheel

    또한 pip와 setuptools의 버전이 최신이어야 합니다. 


    해당 프로젝트 내에 setup.cfg 파일을 생성합니다.( setup.py 파일의 동일한 위치에 생성하면 됩니다.)

    [bdist_wheel]
    universal = 1

    setup.cfg 파일을 생성한 다음, 위의 코드를 넣어줍니다.


    마지막으로 PYPI 업로드시, 옵션 선택하기 에서 사용하는 라이브러리는 from distutils.core import setup 입니다. 해당 라이브러리를 사용하면 에러가 나므로 from setuptools import setup 를 대신 사용해 줍니다.

    위의 과정을 거친 후 명령어를 입력하여 .tar 와 .whl 압축파일을 업로드합니다.

    $ python setup.py sdist bdist_wheel register -r internal upload -r internal


    업로드 시 setup의 attribute는 PYPI 업로드시, 옵션 선택하기 에서 확인할 수 있습니다. ( wheel로 압축해야될 경우,  from distutils.core import setup 이부분을 from setuptools import setup 같이 변경하여 줍니다.)

    private pypi에 올라온 패키지 다른 서버에서 설치 받기


    아래와 같이 명령어를 사용하여 쉽게 install 및 download를 받을 수 있습니다. (이를 사용하기 위해 pip 및 easy_install 설치가 필요합니다.)


    pip 사용하여 다운로드 받을 때

    $  pip download --trusted-host ip주소 --index-url pypi 주소/simple/ 패키지명
     
    -- 예시
    $  pip install --trusted-host 10.101.30.124 --index-url http://10.101.30.124:8080/simple/ imi


    easy_install 사용하여 다운로드 받을 때

     $ easy_install -i pypi 주소/simple 패키지명
     
    --예시
    $ easy_install -i http://10.101.30.124:8080/simple imi

    Adding Third Party Packages


    아래의 명령어를 사용하여 해당 패키지를 미러링할 수 있습니다.

    $ pip install -d /srv/pypi 패키지명

    미러링된 패키지 업데이트하기


    아래 명령어를 실행시켜 미러링된 패키지에 대해 업데이트를 할 수 있습니다.

    $ pypi-server -U /srv/pypi

    레파지토리에 있는 각 패키지들은 업데이트를 확인하고 업데이트 합니다. 

    댓글