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

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

'저장소 > PYPI' 카테고리의 다른 글

PYPI 업로드시, 옵션 선택하기  (0) 2016.05.21
PYPI  (0) 2016.05.21

+ Random Posts