Оскільки цього питання ОП ще ніхто не висвітлював:
Що я хотів зробити:
Зробіть модуль python інстальованим за допомогою "pip install ..."
Ось абсолютний мінімальний приклад, який показує основні етапи підготовки та завантаження вашого пакету до PyPI за допомогою setuptools
та twine
.
Це аж ніяк не замінює прочитання принаймні навчального посібника , його набагато більше, ніж висвітлено в цьому самому базовому прикладі.
Створення самого пакету вже охоплене іншими відповідями, тож припустимо, що ми охопили цей крок і нашу структуру проекту так:
.
└── hellostackoverflow/
├── __init__.py
└── hellostackoverflow.py
Для того, щоб використовувати setuptools
для упаковки, нам потрібно додати файл setup.py
, який йде в кореневу папку нашого проекту:
.
├── setup.py
└── hellostackoverflow/
├── __init__.py
└── hellostackoverflow.py
Як мінімум, ми вказуємо метадані нашого пакету, наші setup.py
виглядатимуть так:
from setuptools import setup
setup(
name='hellostackoverflow',
version='0.0.1',
description='a pip-installable package example',
license='MIT',
packages=['hellostackoverflow'],
author='Benjamin Gerfelder',
author_email='benjamin.gerfelder@gmail.com',
keywords=['example'],
url='https://github.com/bgse/hellostackoverflow'
)
Оскільки ми встановили license='MIT'
, ми включаємо в наш проект копію LICENCE.txt
, поряд з файлом readme в reStructuredText як README.rst
:
.
├── LICENCE.txt
├── README.rst
├── setup.py
└── hellostackoverflow/
├── __init__.py
└── hellostackoverflow.py
На даний момент ми готові перейти до упаковки, використовуючи setuptools
, якщо у нас її вже не встановлено, ми можемо встановити її за допомогою pip
:
pip install setuptools
Для того, щоб це зробити і створити source distribution
, у кореневій папці нашого проекту ми викликаємо наш setup.py
командний рядок із зазначенням, що ми хочемо sdist
:
python setup.py sdist
Це створить наш дистрибутивний пакунок та інформацію про яйця та призведе до такої структури папки з нашим пакетом у dist
:
.
├── dist/
├── hellostackoverflow.egg-info/
├── LICENCE.txt
├── README.rst
├── setup.py
└── hellostackoverflow/
├── __init__.py
└── hellostackoverflow.py
На даний момент у нас є пакет, який ми можемо встановити, використовуючи pip
, таким чином, з нашого кореня проекту (якщо у вас є всі назви, як у цьому прикладі):
pip install ./dist/hellostackoverflow-0.0.1.tar.gz
Якщо все піде добре, тепер ми можемо відкрити інтерпретатора Python, я б сказав десь за межами нашого каталогу проектів, щоб уникнути плутанини, і спробувати використовувати наш новий блискучий пакет:
Python 3.5.2 (default, Sep 14 2017, 22:51:06)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from hellostackoverflow import hellostackoverflow
>>> hellostackoverflow.greeting()
'Hello Stack Overflow!'
Тепер, коли ми підтвердили, що пакет встановлюється та працює, ми можемо завантажити його в PyPI.
Оскільки ми не хочемо забруднювати реальний сховище своїми експериментами, ми створюємо обліковий запис для тестового сховища та встановлюємо twine
для процесу завантаження:
pip install twine
Зараз ми майже там, з нашим створеним обліковим записом ми просто кажемо twine
завантажити наш пакет, він попросить наші облікові дані та завантажить наш пакунок у вказане сховище:
twine upload --repository-url https://test.pypi.org/legacy/ dist/*
Тепер ми можемо увійти до нашого облікового запису в тестовому сховищі PyPI і дивуватися нашому щойно завантаженому пакету на деякий час, а потім захопити його за допомогою pip
:
pip install --index-url https://test.pypi.org/simple/ hellostackoverflow
Як ми бачимо, основний процес не дуже складний. Як я вже говорив раніше, тут є набагато більше, ніж тут висвітлено, тому заздалегідь читайте підручник для більш поглибленого пояснення.