Поскольку никто еще не освещал этот вопрос ОП:
Что я хотел сделать:
Сделайте модуль 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
Это создаст наш дистрибутивный пакет и egg-info, и в результате мы получим структуру папок, подобную этой, с нашим пакетом в 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
Как видим, основной процесс не очень сложен. Как я уже говорил ранее, в этом есть гораздо больше, чем здесь, так что читайте учебник для более подробного объяснения.