>백엔드 개발 >파이썬 튜토리얼 >Python 모듈을 패키징하고 게시하는 방법에 대한 자세한 설명

Python 모듈을 패키징하고 게시하는 방법에 대한 자세한 설명

高洛峰
高洛峰원래의
2017-02-22 17:03:171709검색

머리말

어제 VASP 파일 처리 라이브러리를 패키징하여 PyPI에 업로드했습니다. 이제 pip와 easy_install을 통해 VASPy를 직접 설치할 수 있습니다. (동시에 VASP를 사용하여 계산 화학을 수행하는 어린이도 환영합니다. 별 추가) 및 참여),

VASPy의 GotHub 주소: 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

패키징 및 설치 장 타사 패키지 도구

여기에서는 setuptools 및 pip와 같은 도구를 사용하여 자체 패키지를 패키지하고 게시하고 설치해야 합니다. 휠에 빌드하려면 휠 모듈도 설치해야 합니다. . Python 버전 >=2.7.9 또는 >=3.4인 경우 setuptools 및 pip가 이미 설치되어 있으므로 최신 버전

pip install -U pip setuptools

으로 업데이트해야 할 수도 있습니다.

yum install pip
sudo apt-get install pip

와 같은 패키지 관리 도구를 사용하여 get-pip.py 스크립트를 통해 설치할 수 있습니다. 휠 및 setuptools가 설치되지 않은 것으로 감지되면 자동으로 설치됩니다.

python get-pip.py

구체적인 도구 설치 및 소개에 대해서는 자세히 설명하지 않겠습니다. 패키지 설치 요구사항을 참고하세요

패키지에 있는 다양한 파일의 기능

setup.py

이 파일은 전체 프로젝트를 패키징하는 데 가장 중요한 파일입니다.

setup()이라는 두 가지 주요 기능을 제공합니다. 함수 이 함수의 매개변수는 자신의 프로젝트를 구성하는 방법을 지정합니다.
패키징, 테스트, 게시 등을 포함한 명령줄 도구 다음 명령을 통해 볼 수 있습니다.

python setup.py --help-commands

setup.cfg

이 파일에는 빌드 시 다음과 같은 일부 기본 매개변수가 포함되어 있습니다. bdist_wheel 빌드 --universal 매개변수

[bdist_wheel]
universal=1

는 패키징할 때마다 기본적으로 사용됩니다. 효과는 비슷합니다:

python setup.py bdist_wheel --universal

README.rst

저는 원래 이것을 마크다운으로 작성했습니다. PyPI에 패키징하고 게시한 후에 PyPI가 마크다운 렌더링을 지원하지 않는다는 것을 알았기 때문에 다음을 사용하여 다시 작성했습니다. reStruedText 구문을 다시 작성했습니다. 결국 마크업 언어 구문은 기본적으로 몇 초 만에 배울 수 있습니다. 실제로 불가능하다면 템플릿을 찾아 조롱박을 그리면 됩니다.
reStructureText의 구문 규칙은 공식 문서인 Quick reStructuredText를 참조하세요.

사실 또 다른 방법은 pandoc을 사용하여 마크다운을 rst 형식으로 변환하는 것입니다. 게시할 때 자동으로 변환하는 pyandoc 모듈.
구체적인 방법은 다음을 참조하세요. Python 모듈에서 Markdown README 사용

MANIFEST.in

이 파일은 패키징할 때 단위와 같은 추가 파일을 패키징해야 함을 setuptools에 알려줍니다. 내 VASPy에서는 이 파일을 사용하여 테스트용 테스트 데이터 파일을 포함하겠습니다. 물론 README와 LICENSE도 함께 ​​패키징할 수 있습니다.
다음은 내 MANIFEST.in의 내용입니다.

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

구체적인 문법 규칙은 MANIFEST.in 템플릿

vaspy/

을 참조하세요. 이 폴더는 vaspy 소스코드가 위치한 패키지입니다.

tests/

이 폴더도 하위 패키지이며 단위 테스트 스크립트를 포함하고 있으며 단위 테스트를 위해 python setup.py 테스트를 사용하기 위해 특별히 __init__.pys를 추가합니다. 가방.

setup()의 매개변수

다음은 제가 사용하는 몇 가지 매개변수입니다. 다른 매개변수의 구체적인 사용법은 https://docs.python.org/3/을 참조하세요. distutils/setupscript .html

name

versions = "vaspy"

는 전체 프로젝트의 이름입니다. 이 이름과 버전 번호는 패키징 후에 사용됩니다. .

version

from vaspy import __version__
version = __version__

description

은 프로젝트에 대한 간단한 설명으로, 일반적으로 한 문장으로 구성되며 pypi에서 이름 하단에 표시됩니다.

long_description

은 긴 설명으로, 이는 프로젝트에 대한 간결한 설명과 동일합니다. 이 문자열이 첫 번째 형식인 경우 PyPI는 표시를 위해 자동으로 HTML로 렌더링합니다. README.rst의 내용은 여기에서 직접 읽을 수 있습니다.

url

패키지 링크. 일반적으로 GitHub 링크 또는 문서 읽기 링크입니다.

packages

setuptools는 루트 경로에서 패키지를 찾는 데 도움이 되는 하위 패키지 목록을 제공합니다. 이 기능은 distutil에 없습니다.

setup_requires

이 매개변수는 VASPy의 설치 및 원활한 작동에 필요한 기타 종속성(가장 기본)을 정의합니다. 이러한 종속성은 pip를 사용하여 설치할 때 설치됩니다.
이 매개변수와 요구사항.txt의 차이점은 다음을 참조하세요. install_requires 및 요구사항 파일

분류자

이 매개변수는 다양한 카테고리에 속하는 일련의 분류를 제공합니다. PyPI에서 항목은 디렉토리에 분류되어 있습니다.
특정 카테고리 이름 및 규칙에 대한 참조: https://pypi.python.org/pypi?%3Aaction=list_classifiers

test_suite

이 매개변수는

python setup.py 테스트

단위 테스트를 실행하기 위해 더 이상 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.

也就是说这个参数可以接受多种类型的参数:

接收unittest.TestCase子类,我们可以讲所有单元测试写入一个测试用例中,然后import进来,再传你给test_suite
接收函数对象,此函数对象没有任何参数,且返回一个unittest.TestSuite.这样我们就可以单独写一个函数,将多个测试用例合并成一个suite然后返回,然后再将函数import进来传给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
writing manifest file 'vaspy.egg-info/SOURCES.txt'
reading manifest file 'vaspy.egg-info/SOURCES.txt'
reading manifest template 'MANIFEST.in'
writing manifest file 'vaspy.egg-info/SOURCES.txt'
running build_ext
test_compare (tests.incar_test.InCarTest)
Make sure we can compare two InCar objects correctly. ... 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. 上传至PyPI

若上面的测试成功,我们就可以按照相同的步骤将包注册并上传。

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

Ok,之后我们就可以在PyPI(https://pypi.python.org/pypi/vaspy/)上看到我们自己的包了。

更多打包发布Python模块的方法详解相关文章请关注PHP中文网!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.