English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Python 모듈 패키징 및 배포 방법 설명

서론

어제 자신의 VASP 파일 처리 라이브러리를 패키징하고 PyPI에 업로드했으며, 지금은 pip과 easy_install을 통해 VASPy를 설치할 수 있습니다. (VASP를 사용하여 화학 계산을 하는 동료들도 별을 달고 참여해 주세요)

VASPy의 GitHub 주소:https://github.com/PytLab/VASPy
VASPy의 PyPI 주소:https://pypi.python.org/pypi/vaspy/

제 기억력은 정말 좋지 않아, 시간이 지나면 잊을까봐, 여기서 즉시 자신의 VASPy 프로그램을 예로 들어 python의 패키징과 업로드에 대한 요약을 작성했습니다.

VASPy 패키지 파일 구조

먼저 VASPy 패키지의 전체 파일 구조를 적어보고, 이후의 내용은 이를 예로 들어 설명합니다:

VASPy/
├── LICENSE
├── MANIFEST
├── MANIFEST.in
├── README.rst
├── requirements.txt
├── scripts
│  ├── change_incar_parameters.py
│  ├── create_inputs.py
│  │  └── ...
├── setup.cfg
├── setup.py
├── tests
│  ├── incar_test.py
│  ├── __init__.py
│  ├── oszicar_test.py
│  ├── outcar_test.py

│  ├── testdata
│  │  ├── CONTCAR
│  │  ├── DOS_SUM
│  │  ├── ELFCAR
│  │  └── ...
│  └── ...
  └── vaspy
  ├── __init__.py
  ├── iter.py
  ├── matstudio.py
4 directories, 54 files

công cụ đóng gói và cài đặt gói bên thứ ba

Ở đây chúng ta cần借助 các công cụ như setuptools và pip để đóng gói và phát hành gói của mình, nếu cần xây dựng thành wheel thì还需要安装wheel module. Nếu python phiên bản>=2.7.9hoặc>=3.4setuptools và pip đã được cài đặt, có thể cần phải cập nhật lên phiên bản mới nhất

pip install -U pip setuptools

Có thể sử dụng công cụ quản lý gói, ví dụ

yum install pip
sudo apt-get install pip

qua get-pip.py 스크립트 설치, nếu phát hiện rằng không đã cài đặt wheel và setuptools cũng sẽ tự động cài đặt

python get-pip.py

cụ thể công cụ cài đặt và giới thiệu không cần đề cập nhiều, có thể tham khảo requirements for installing packages

패키지 내 다른 파일의 역할

setup.py

이 파일은 전체 프로젝트를 패키지하는 가장 중요한 파일입니다. 이 파일은 두 가지 주요 기능을 제공합니다:

setup() 함수는 이 함수의 매개변수가 프로젝트를 어떻게 구성할지를 지정합니다.
명령 줄 도구로, 패키지를 패키지로打包, 테스트, 배포 등을 포함하고 있습니다. 다음 명령을 사용하여 확인할 수 있습니다;

python setup.py --help-commands

setup.cfg

이 파일은 빌드할 때 일부 기본 매개변수를 포함하고 있습니다. 예를 들어 bdist_wheel을 빌드할 때의--universal 매개변수

[bdist_wheel]
universal=1

이렇게 하면 매번打包할 때마다 기본적으로 사용됩니다--universal 매개변수를 추가하면, 효과는 다음과 같습니다:

python setup.py bdist_wheel --universal

README.rst

이�始로 저는 markdown로 작성했고, PyPI에 배포한 후 PyPI가 markdown 렌더링을 지원하지 않는다는 것을 발견했어요. 페이지에선 전체가 혼란스러워졌고, 따라서 reStructuredText 문법으로 다시 작성했습니다. 마크업 언어 문법은 매우 쉽게 배울 수 있고, 필요하다면 템플릿을 사용하여 나비 모양을 그릴 수 있습니다.
reStructuredText의 문법 규칙은 공식 문서를 참고하세요: Quick reStructuredText

실제로는 pandoc를 사용하여 markdown를 rst 형식으로 변환하는 방법도 있습니다. 간편한 방법은 pyandoc 모듈을 사용하여 배포 시 자동으로 변환하는 것입니다.
정확한 방법은 다음을 참고하세요: Use Markdown README's in Python modules

MANIFEST.in

이 파일은 패키지를 만들 때 setuptools가 추가로 패키지할 필요 있는 파일을 알려줍니다. 예를 들어, VASPy의 유닛 테스트의 테스트 데이터 파일은 이 파일을 사용하여 포함시켰습니다. 물론 README, LICENSE 등도 이를 통해 함께 패키지할 수 있습니다.
다음은 제가 작성한 MANIFEST.in 내용입니다:

include README.rst
include requirements.txt
include LICENSE
recursive-include scripts *
recursive-include tests *

정확한 문법 규칙은 다음을 참고하세요: The MANIFEST.in template

vaspy/

이 폴더는 vaspy 소스 코드가 있는 패키지입니다.

tests/

이 폴더는 또한 서브 패키지로, 유닛 테스트 스크립트를 포함하고 있습니다. python setup.py test를 사용하여 유닛 테스트를 수행할 수 있도록 __init__.py를 추가하여 패키지로 만들었습니다.

setup()의 파라미터

여기서는 제가 사용하는 몇 가지 파라미터만 설명하겠습니다. 다른 파라미터의 사용법은 다음을 참고하세요:https://docs.python.org/3/distutils/setupscript.html

name

versions = "vaspy"

프로젝트의 전체 이름으로, 패키지를 만들 때 이 이름과 버전 번호를 사용합니다.

version

from vaspy import __version__
version = __version__

description

프로젝트에 대한 간단한 설명으로, 일반적으로 한 문장으로 충분합니다. PyPI에서 이름 아래에 표시됩니다.

long_description

이는 긴 설명이며, 프로젝트에 대한 간결한 설명으로, 이 문자열이 rst 형식이면 PyPI가 자동으로 HTML로 렌더링합니다. README.rst 파일의 내용을 직접 읽을 수 있습니다.

url

패키지의 링크로, 일반적으로 GitHub의 링크나 readthedocs의 링크입니다.

packages

포함해야 할 서브 패키지 목록을 정의합니다. setuptools는 find_packages() 함수를 제공하여 루트 경로에서 패키지를 찾아줍니다. 이 함수는 distutil에서는 없습니다.

setup_requires

이 매개변수는 VASPy 설치와 원활한 실행에 필요한 추가적인 의존성(기본적인 것들)을 정의합니다. pip을 사용하여 설치할 때 이러한 의존성이 설치됩니다.
이 매개변수와 requirements.txt의 차이에 대한 정보는 다음을 참조하세요: install_requires vs Requirements files

classifier

이 매개변수는 PyPI에서 다른 디렉토리에 프로젝트를 분류하는 데 사용되는 일련의 분류를 제공합니다.
특정 categories의 이름과 규칙에 대한 자세한 정보는 다음을 참조하세요:https://pypi.python.org/pypi#63;%3Aaction=list_classifiers

test_suite

이 매개변수는 우리가 사용할 수 있도록 도와줍니다

python setup.py test

단위 테스트를 실행하려면 더 이상 별도의 스크립트를 작성할 필요가 없습니다. 예를 들어 run_tests.py와 같은 스크립트로 테스트를 실행합니다.
이 매개변수의 공식 설명:

A string naming a unittest.TestCase subclass (or a package or module containing one or more of them, or a method of such a subclass), or naming a function that can be called with no arguments and returns a unittest.TestSuite. If the named suite is a module, and the module has an additional_tests() function, it is called and the results are added to the tests to be run. If the named suite is a package, any submodules and subpackages are recursively added to the overall test suite.

That is, this parameter can accept multiple types of parameters:

unittest.TestCase subclass receiving, we can put all unit tests into a single test case and then import it and pass it to test_suite.
function object receiving, this function object has no parameters and returns a unittest.TestSuite. In this way, we can write a single function to merge multiple test cases into a suite and return it, and then import the function and pass it to test_suite.

모듈과 패키지 이름, 저는 이 방식을 사용합니다. 이전에는 여러 개의 스크립트로 분리된 테스트를 수행했지만, 이제 __init__.py를 추가하여 패키지로 변환할 수 있습니다. 패키지 이름을 test_suite에 전달하면 setuptools가 이 패키지 아래의 모든 테스트를 자동으로 실행합니다. 이제 테스트 스크립트를 추가할 때마다 새로운 스크립트를 추가하면 됩니다. 다른 것이 수정되지 않습니다.

运行效果:

zjshao@SHAO-PC:/mnt/d/Dropbox/Code/CentOS_code/VASPy$ python setup.py test
running test
running egg_info
creating vaspy.egg-info
writing vaspy.egg-info/PKG-INFO
writing top-level names to vaspy.egg-info/top_level.txt
writing dependency_links to vaspy.egg-info/dependency_links.txt
manifest 파일 'vaspy.egg' 쓰기-info/SOURCES.txt'
reading manifest file 'vaspy.egg-info/SOURCES.txt'
manifest 템플릿 'MANIFEST.in' 읽기
manifest 파일 'vaspy.egg' 쓰기-info/SOURCES.txt'
build_ext 실행 중
test_compare (tests.incar_test.InCarTest)
두 InCar 객체를 올바르게 비교할 수 있는지 확인하십시오. ... ok
test_eq (tests.incar_test.InCarTest)
Test __eq__() function. ... ok
...
여기서 몇몇 출력을 생략했습니다
----------------------------------------------------------------------
Ran 22 tests in 3.574s
OK

자신의 python 패키지를 출시하세요

1. 먼저 PyPI에 계정을 등록하세요

2. 설정~/.pypirc 다음과 같이 설정하세요:

[distutils]
index-servers =
  pypi
  pypitest
[pypi]
username:ShaoZhengjiang
password:mypassword
[pypitest]
username:ShaoZhengjiang
password:mypassword

3에 패키지를 등록하고 테스트 서버에 업로드

pypi는 테스트 서버를 제공하며, 이 테스트 서버에서 테스트를 수행할 수 있습니다.

python setup.py register -r pypitest

그런 다음

python setup.py sdist upload -r pypitest

문제가 없다면 오류 메시지를 받지 않을 것입니다.

4에 업로드

위의 테스트가 성공하면, 동일한 단계로 패키지를 등록하고 업로드할 수 있습니다.

python setup.py register -r pypi
python setup.py sdist upload -r pypi

예, 이제 PyPI에서 사용할 수 있습니다.https://pypi.python.org/pypi/vaspy/)에 우리의 패키지를 볼 수 있습니다。

좋아하는 것