PYPI에 업로드할 때, 파일 또는 패키지를 어떻게 올릴지 정할 수 있습니다. 아래에서는 PYPI에 어떠한 옵션으로 올릴 수 있는지 확인하겠습니다.

SETUP의 Attribute


setup의 attribute는 다음과 같이 정의합니다.

from distutils.core import setup

setup(
    name='untitled8',
    version='0.3',
    package_dir={'':'untitled8'},
    author='lee',
    author_email='lee@lee.com',
    description='test_django_project method',
)

name

pypi 서버에 올릴 모듈 또는 패키지의 이름입니다.

version

pypi 서버에 올릴 버전입니다. 만약 이름과 버전이 이미 pypi 서버에 올라와 있는 경우, 403 (404?)에러를 뱉어줍니다.

패키지? 모듈?

사용자가 pypi 서버에 올릴 때, 모듈로 업로드할 지, 패키지로 업로드할 지 선택을 할 수 있습니다.

모듈 또는 파이썬 파일

모듈 또는 파이썬 파일만 올릴 땐 다음 attribute를 사용합니다.

from distutils.core import setup
setup(name='foo',
      version='1.0',
      py_modules=['foo']
      )

py_modules 안에 들어가는 내용은 사용자가 올릴 파이썬 파일명과 동일해야 합니다.( 여러 개 선택 가능)  

패키지

패키지는 다음과 같은 구조로 되어 있다고 가정하겠습니다.

  • untitled8
    • chartcheck
      • migrations
    • library
    • templates
    • untitled8
    • manage.py
    • test.py

패키지 추가 attribute에는 packages 와 package_dir 이 있습니다.

packages attribute는 리스트로 추가하고자 하는 앱의 이름을 적습니다. 또한 리스트에 적힌 이름의 폴더 안에 __init__.py가 있다는 가정하에 pypi 서버에 업로드 하는 것입니다.

package_dir은 딕셔너리로 좌변은 사용자가 쓰고자 하는 이름, 우변은 추가하고자 하는 앱의 이름을 적습니다. package_dir로 사용자가 쓰고자 하는 이름을 정의한 다음, packages로 앱을 추가해야 합니다.

프로젝트 내 파이썬 파일 업로드

프로젝트 아래의 파이썬 파일만 업로드하고 싶을 때 아래와 같이 사용합니다.

from distutils.core import setup
setup(name='foobar',
      version='1.0',
      packages=['']
      )

위와 같이 packages 어레이 중 '' 이 있을 경우 앱이 아닌 프로젝트 안에 존재하는 파이썬 파일 전체를 pypi서버에 전송합니다. 따라서 pypi 서버에서 해당 패키지를 내려받으면 manage.py와 test.py가 있는 것을 확인할 수 있습니다.

프로젝트 내 앱 업로드

프로젝트 아래의 앱을 업로드하고 싶을 때 아래와 같이 사용합니다.

from distutils.core import setup
setup(name='foobar',
      version='1.0',
      packages=['chartcheck','library']
      )

위와 같이 사용할 경우, chartcheck와 library 앱과 그 안의 파이썬 파일이 pypi 서버에 업로드됩니다. (migrations 제외)

프로젝트 내 앱 안의 서브 앱 업로드

프로젝트 내 앱 안의 서브 앱 업로드는 아래와 같이 사용합니다.

from distutils.core import setup
setup(name='foobar',
      version='1.0',
      packages=['chartcheck','chartcheck.migrations']
      )

pypi에서 확인하면 chartcheck 폴더 안에 파이썬 파일과 migrations 폴더가 존재합니다.

프로젝트 내 모든 파일 한번에 업로드

프로젝트 내 모든 형식의 파일 및 폴더 업로드는 아래와 같이 사용합니다.

 from distutils.core import setup
setup(
    name='untitled8',
    version='1.993',
    packages=[''],
    package_data={'':['*']},
    author='lee',
    author_email='lee@lee.com',
    description='test_django_project method',
)

package_data는 dictonary 타입이며 좌변에는 파일 경로를, 우변에는 리스트 내에 업로드 하고자 하는 파일을 작성하면 됩니다. 위 예제의 경우, 좌변은 ''으로 root 디렉토리를 선택했으며 우변은 ' * '으로 전체 파일을 선택했습니다.

기타

여러 attribute가 존재하고 아래와 같이 사용합니다.

from distutils.core import setup

setup(name='Distutils',
      version='1.0',
      description='Python Distribution Utilities',
      author='Greg Ward',
      author_email='gward@python.net',
      url='https://www.python.org/sigs/distutils-sig/',
      packages=['distutils', 'distutils.command'],
     )

packages_data 설명



위에서 설명한 것과 같이 package_data={'':['*']}를 사용하여 프로젝트 내 전체 파일을 업로드할 수 있습니다. 

packages=['']
package_data={'':[*.py]}
#를 할 경우 프로젝트 내 전체 파일이 아닌 루트폴더에 있는 파이썬 파일만 업로드 됩니다.
 
packages=['','templates']
package_data={'':[*.py,], 'templates':[*.html]}
#일 경우, 루트 쪾에 있는 파이썬 파일과 templates폴더 안의 모든 html 파일이 업로드 됩니다.


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

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

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

+ Recent posts