Подтвердить что ты не робот

Как создать пакет python 2.x - простой случай

Просьба показать простой и современный стандартный способ создания пакета python для python 2.x

Я бы предпочел использовать pip для установки пакета позже.

Пакет должен содержать один класс:

class hello:
  def greet(self):
    print "hello"

Вы должны иметь возможность сделать следующее:

pip install my_package-0.1.1....

И затем используя его:

from my_package import hello

h = hello.hello()
h.greet()

Я прошу:

  • Каталог и расположение файлов
  • Содержание файлов
  • для создания дистрибутивного файла пакета
  • чтобы установить пакет из дистрибутивного файла пакета (используя предпочтительно пип)

Есть несколько howtos, которые я нашел, но я до сих пор не знаю, как этот простой и урезанный случай (без вложенных пакетов, удаления всех файлов и функций, которые могут быть опущены для самого простого случая), будет обрабатываться и это современный способ сделать это.

Я бы хотел, чтобы этот вопрос попал в состояние вики сообщества, поэтому вы не получите никаких очков, и я дам достаточно времени и помету ответ, принятый через несколько дней, также учитывая голоса и комментарии.

Edit:

У меня есть первый пример, который я хочу поделиться, я использовал Marius Gedminas для ответа. Он не содержит всего, что должно быть там, но оно работает, поэтому оно может продемонстрировать суть технического процесса. Чтобы добавить более необходимые детали, пожалуйста, прочитайте ответ Мариуса ниже.

Структура каталогов:

MyProject/
    setup.py
    my_package.py
    README.txt
    MANIFEST.in

setup.py:

from setuptools.import setup
setup(name='MyProject',
      version='0.1',
      py_modules=['my_package'])

my_package.py:

class hello:
  def greet(self):
    print "hello"

MANIFEST.in:

include *.txt

Чтобы создать пакет из этой папки, зайдите в папку MyProject и запустите:

$ python setup.py sdist

Это создаст файл MyProject-0.1.tar.gz в подпапке dist/. Скопируйте этот файл в папку на целевой машине.

На целевой машине запустите эту команду в папке, содержащей MyProject-0.1.tar.gz:

sudo pip install MyProject-0.1.tar.gz

Теперь может потребоваться выйти и снова войти на целевую машину, чтобы пакет был найден. После этого вы можете протестировать пакет на целевой машине с помощью оболочки python:

$ python
>>> import my_package
>>> h = my_package.hello()
>>> h.greet()
hello
>>> 

После этого, пожалуйста, не забудьте добавить другое необходимое содержимое, см. ниже ответ Мариуса.

4b9b3361

Ответ 1

Запустить простую

Простейший пакет с одним файлом:

MyProject/
    setup.py
    my_package.py

Простейший setup.py:

from setuptools import setup
setup(name='MyProject',
      version='0.1',
      author='Your Name',
      author_email='[email protected]',
      license='MIT',
      description='Example package that says hello',
      py_modules=['my_package'])

Включение дополнительных файлов в пакет

Далее вы должны добавить README:

MyProject/
    MANIFEST.in
    README.rst
    setup.py
    my_package.py

Обратите внимание на новый файл - MANIFEST.in. Он указывает, какие файлы, отличные от Python, должны быть включены в ваш исходный дистрибутив:

include *.rst

Люди скажут вам: "О, пропустите манифест, просто добавьте файлы в исходный элемент управления, setuptools найдут их". Игнорируйте этот совет, он слишком подвержен ошибкам.

Использование страницы PyPI

Полезно сделать README.rst доступным для просмотра людьми в Интернете по индексу пакета Python. Поэтому измените свой setup.py, чтобы сделать

from setuptools import setup
with open('README.rst') as f:
    readme = f.read()
setup(name='MyProject',
      ...
      description='Example package that says hello',
      long_description=readme,
      ...)

Используйте ReStructuredText для более красивых страниц. Используйте

python setup.py --long-description | rst2html

рано ловить ошибки ReStructuredText.

Более одного модуля Python в пакете

В ближайшее время не будет достаточно одного файла, поэтому измените его на пакет (запутанное предупреждение о терминологии: пакет Python, как в каталоге с __init__ py, а не как в распространяемом автономном архиве):

MyProject/
    MANIFEST.in
    README.rst
    setup.py
    my_package/
        __init__.py
        some_module.py

и измените setup.py на

from setuptools import setup, find_packages
with open('README.rst') as f:
    readme = f.read()
setup(name='MyProject',
      version='0.2',
      author='Your Name',
      author_email='[email protected]',
      license='MIT',
      description='Example package that says hello',
      long_description=readme,
      packages=find_packages())

Освобождение от общего доступа

Получить учетную запись PyPI - вам нужно сделать это только один раз.

Чтобы сделать выпуск, убедитесь, что номер версии в setup.py правильный, затем запустите

python setup.py sdist register upload

Что это.

Сообщать людям, чтобы установить его

Сообщите им

pip install MyProject

(то же имя, которое вы указали в setup.py как аргумент name для setup())

Ответ 2

Следующее копируется из учебника Distutils.

Макет файла:

top
|-- package
|   |-- __init__.py
|   |-- module.py
|   `-- things
|       |-- cross.png
|       |-- fplogo.png
|       `-- tick.png
|-- runner
|-- MANIFEST.in
|-- README
`-- setup.py

Чтобы выполнить установку tarball, вы просто запускаете:

python setup.py sdist

Чтобы установить пакет, используйте pip или easy_install:

pip install my_package-1.2.3.tar.bz2

или

easy_install my_package-1.2.3.tar.bz2

Кроме того, вы можете загрузить его в PyPI, сначала зарегистрируйте его:

python setup.py register

затем загрузите исходный архив

python setup.py sdist upload

Вы также можете загружать двоичные яйца (хотя и не обязательно):

python setup.py bdist_egg upload

Затем люди могут установить его так:

pip install my_package==1.2.3

или,

easy_install my_package==1.2.3