Как сделать лицензию на программу python

Добавил пользователь Алексей Ф.
Обновлено: 04.10.2024

Заметка повествует об этапе создания дистрибутива программы на языке python. Что под этим подразумевается? Допустим, вам крайне необходимо передать свою программу заинтересованным в ней лицам. Что будет содержать такая программа? Скорее всего, в ней будут присутствовать библиотечные модули, пакеты и, конечно, файл README или иная документация. Как правильно создать дистрибутив такой программы? Вот об этом и поговорим.


Примерная структура программы:

spam ├── Documentation.txt - документация ├── libspam.py - одиночный библиотечный модуль ├── README.txt - описание пакета/установки ├── runspam.py - модуль запуска программы └── spampkg - пакет ├── bar.py - модуль ├── foo.py - модуль └── __init__.py

Не забудьте добавить в каждый пакет программы файл __init__.py для указания того, что данный подкаталог является пакетом. Файл __init__.py может быть пустым, а может содержать программный код, выполняющий инициализацию пакета.

После подготовки каталога, нужно создать файл setup.py на самом верхнем уровне и поместить в него код:

Если какого-то из указанных компонентов нет в программе, он может быть опущен.
Полный перечень:
name - имя пакета
version - номер версии пакета
author - кто является авором
author_email - электронная почта автора
maintainer - кто сопровождает пакет
maintainer_email - электронная почта мейнтейнера
url - сайт программы
description - краткое описание пакета
long_description - полное описание пакета
download_url - адрес, откуда можно загрузить пакет
classifiers - список строк классификаторов

Теперь займёмся созданием дистрибутива. Для этого, находясь в каталоге с программой, введите в командной строке:
$ python setup.py sdist

В результате в текущем каталоге появится файл MANIFEST и подкаталог с именем dist , в котором и будет находиться архивный файл для установки вашей программы.
Например:

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

Иногда может потребоваться создать двоичный дистрибутив. Например, если приложение содержит "платформозависимые" компоненты. В таком случае следует использовать команду bdist. Например:

Таким образом можно создать исполняемый exe-файл для Windows. Из командной строки Windows для этого достаточно выполнить:

После запуска подобного файла в Windows откроется диалог мастера установки. У данного подхода имеется лишь один недостаток: сам интерпретатор python должен быть установлен на машине пользователя. Чтобы этого не требовалось, используйте py2exe.
py2exe можно забрать с sourceforge . К сожалению, на момент написания поста версия python3 ещё не поддерживается.

Для этой утилиты нам нужно немного изменить наш файл setup.py :

Далее следуют нехитрые манипуляции:
setup.py py2exe

После этого, как и в случае с bdist, появятся две директории: build и dist, содержащие программу запуска, модули и различные библиотеки. Если вам нужно более подробно ознакомиться с py2exe, обратитесь к официальной документации проекта.

вопрос: если я буду делать проприетарную программу на Python (то есть буду выдавать на руки *.pyc-файлы БЕЗ *.py-файлов, по своим угнетающим условиям) с использованием графического пользовательского интерфейса запрограммированного через PyQt ---- буду ли я злостным нарушителем? и самое главное какой пункт лицензии GPL3 в этом случае я буду нарушу, относительно использования PyQt?

дополнительно обстоятельство: во время выдачи программы на руки — внутри диретории с программой — будут лежать все необходимые для работы программы файлы — в том числе бинарные файлы от PyQt.

примечание: бинарные файлы PyQt — НЕ модифицированны мною, и ни одна из частей файлов PyQt не слинкована ни с одним из моих файлов. а внутри файлов — *.pyс вообще нет ни одной частички от файлов PyQt, это же не какой-нибудь там C/C++!

дополнительный дисскуссионный вопрос: если мы вдруг выясним в этой теме что я ничего не нарушу — то на кой вообще тогда было делать PySide с лицензией LGPL3 ? какие лицензионные свободы дала бы LGPL3 по сравнению GPL3 — в случае использования pyc-файлов которые всё равно не линкуются?

Данная лицензия предоставляет разрешение для исходного и бинарного кода на:

  • воспроизведение,
  • анализирование,
  • тестирование,
  • публикацию,
  • публичную демонстрацию,
  • создание производных работ,
  • распространение,
  • прочие виды использования.

Как применить к своей работе

Мы рекомендуем для этого создать файл с названием license.txt и поместить текст лицензии в него. Файл поместить в корневой каталог распространяемой работы.

Как использовать чужую работу

Использование

Распространение

При распространении необходимо:

  • приложить копию данного лицензионного соглашения,
  • приложить копию данного уведомления об авторских правах.

Изменение

При изменении необходимо:

  • включить краткое резюме о внесенных изменениях.

Распространение измененной версии

При распространении необходимо:

  • приложить копию данного лицензионного соглашения,
  • приложить копию данного уведомления об авторских правах.

Ответственность

Гарантий не предоставляется.

Ограничения на экспорт

Ограничений на экспорт нет.

Комментарии юриста

Текст лицензии

Текст на русском языке (Перевод)

Исходный вариант текста

PSF LICENSE AGREEMENT

1. This LICENSE AGREEMENT is between the Python Software Foundation ("PSF"), and the Individual or Organization ("Licensee") accessing and otherwise using Python 2.1.1 software in source or binary form and its associated documentation.

2. Subject to the terms and conditions of this License Agreement, PSF hereby grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use Python 2.1.1 alone or in any derivative version, provided, however, that PSF's License Agreement and PSF's notice of copyright, i.e., "Copyright (c) 2001 Python Software Foundation; All Rights Reserved" are retained in Python 2.1.1 alone or in any derivative version prepared by Licensee.

3. In the event Licensee prepares a derivative work that is based on or incorporates Python 2.1.1 or any part thereof, and wants to make the derivative work available to others as provided herein, then Licensee hereby agrees to include in any such work a brief summary of the changes made to Python 2.1.1.

4. PSF is making Python 2.1.1 available to Licensee on an "AS IS" basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 2.1.1 WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.

5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON 2.1.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 2.1.1, OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

6. This License Agreement will automatically terminate upon a material breach of its terms and conditions.

7. Nothing in this License Agreement shall be deemed to create any relationship of agency, partnership, or joint venture between PSF and Licensee. This License Agreement does not grant permission to use PSF trademarks or trade name in a trademark sense to endorse or promote products or services of Licensee, or any third party.

8. By copying, installing or otherwise using Python 2.1.1, Licensee agrees to be bound by the terms and conditions of this License Agreement.

Сейчас существуют две основных ветки (версии) развития языка Python (питон): Python 2 и Python 3. Версия 2 официально считается устаревшей (поддержка версии 2 заканчивается в 2020 году), версия 3 — более новой и современной. Мы будем изучать именно версию 3. Версия 2 существенно отличается от версии 3, мы не будем обсуждать эти отличия.

2.1.2. Установка Python¶

Python — это свободное кросс-платформенное программное обеспечение, поэтому его можно легко скачать с официального сайта, можно свободно распространять, и можно установить на все современные операционные системы.

Если вы работаете в другой операционной системе, то разберитесь, как установить питон, самостоятельно. В Linux, например, питон есть в репозиториях всех ведущих дистрибутивов, пакет обычно называется python3 (а просто python — это питон второй версии).

2.1.3. Установка Wing IDE¶

Сам по себе питон — это только интерпретатор кода. Он запускает ваши программы, но не содержит удобного редактора. Поэтому для написания программ я советую вам использовать среду разработки (по сути, продвинутый редактор) Wing IDE.

Wing IDE — это, к сожалению, не свободное ПО, но у него существует официально бесплатная версия для образовательных целей, называется Wing IDE 101. Она доступна как для Windows, так и для Linux и macOS.

Wing IDE — это просто среда разработки (IDE) для Python, т.е. удобный редактор программ, позволяющий легко запускать программы с помощью питона (именно поэтому надо отдельно устанавливать сам Python — Wing IDE его не включает в себя). В принципе, вы можете использовать и какую-нибудь другую среду разработки, но тогда разбирайтесь с ней сами. В частности, сам Python включает простенькую среду разработки Python IDLE, ее описание вы можете встретить во многих книжках по Python, но она слишком простая и потому не очень удобная. Так же есть популярная среда PyCharm, но на мой вкус она слишком сложная.

2.1.4. Проверка установки¶

Запустите Wing IDE. Появится следующее окошко:

../_images/wing_ide_0.jpg

../_images/wing_ide_config.jpg

Если у вас не получается, напишите мне [1], указав, куда вы установили питон, и прислав скриншоты основного окна Wing IDE и диалога Edit — Configure Python.

2.1.5. Первая программа¶

В основном меню Wing IDE выберите пункт File — New. Появится окно для редактирования текста программы. В этом окне наберите следующий текст:

(Здесь " — это символ кавычек.)

Должно получиться так:

../_images/wing_ide_1.jpg

Убедитесь, что опечаток нет. Сохраните программу: нажмите Ctrl-S или выберите пункт меню File — Save As. Wing IDE предложит выбрать имя файла для сохранения, для первой программы можно выбрать любое имя.

Обратите внимание, что Wing IDE раскрашивает вашу программу. Это делается для того, чтобы ее было удобнее читать; на самом деле для питона цвет не важен, он сделан только для того, чтобы вам было удобнее читать. Аналогично, в этом тексте код тоже раскрашен, причем раскраска может быть немного другой (это просто обусловлено системой, которую я использую для написания текста). Но еще раз: цвета только для удобства чтения, никакой больше нагрузки они не несут, в частности, Wing может раскрашивать не так, как вы видите в этом тексте, это не страшно.

../_images/wing_ide_2.jpg

значит, все хорошо, программа успешно выполнилась.

../_images/wing_ide_3.jpg

значит, в вашей программе есть ошибки. Подробнее про ошибки ниже (раздел Ошибки в программе ), а пока, если вы увидели ошибку, то просто внимательно проверьте, не ошиблись ли вы где-нибудь в наборе программы.

Позапускайте программу (зеленой стрелочкой) ещё несколько раз и посмотрите на результаты. Вы увидите что, Wing IDE каждый раз печатает строку evaluate. перед запуском программы, потом программа печатает свою строку. Вывод программы перемешивается с выводом Wing IDE — ничего страшного, это нормально.

2.1.6. Ошибки в программе¶

Имейте в виду, что питон не телепат и не может точно определить, где вы допустили ошибку. Он подсвечивает красным ту строку, где текст программы впервые разошёлся с правилами языка. Поэтому бывает, что на самом деле ваша ошибка чуть выше, чем подсвеченная строка (а иногда — и намного выше). Но тем не менее место, которое выделил питон, обычно бывает полезно при поиске ошибки.

Попробуйте в своей программе поделать разные ошибки и посмотрите, как на них отреагирует питон.

2.1.7. Как работает эта программа¶

Давайте разберём, как эта программа работает. Напомню её текст:

Вообще, любая программа — это, в первую очередь, последовательность команд, которые программист даёт компьютеру, а компьютер будет последовательно их выполнять.

Если аргументом команды print является некоторая строка, заключённая в кавычки (символы " ), то команда print выводит эту строку на экран как есть (без кавычек). Поэтому первым делом наша команда выводит на экран текст Test .

Вторым аргументом команды print в нашем примере является арифметическое выражение 2*2 . Если аргументом команды (любой команды, не обязательно именно print , просто других мы пока не знаем) является арифметические выражение, то компьютер сначала вычислит его, а потом передаст команде. Поэтому в данном случае сначала компьютер вычислит \(2\cdot 2\) , получит 4, а потом передаст результат команде print , которая выведет его на экран.

Команда print разделяет выводимые элементы пробелами, поэтому между Test и 4 выведен пробел.

В итоге получается, что наша программа выводит Test 4 .

2.1.8. Использование питона как калькулятора¶

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

Кроме того, есть так называемые функции:

Запись abs(-3) обозначает взятие числа по модулю: \(|3|\) . Обратите внимание: пишется сначала имя функции (в данном случае abs ), а потом в скобках — от чего взять эту функцию (от чего взять модуль в данном случае). То, что в скобках, аналогично командам называется аргументом функции.

Аналогично, запись sqrt(4) обозначает взятие квадратного корня (если не знаете, что это такое, то пока пропустите этот пункт), но, поскольку эта операция бывает нужна несколько реже, то чтобы ее использовать, в начале программы надо написать магическую строку from math import * . Программа получается, например, такая:

Все эти операции можно комбинировать. Например, команда print( (20 * 3) + sqrt( 2 + abs(5 - 7) ) ) выведет на экран значение выражения \(20\cdot 3 + \sqrt<2+|5-7|>\) . Пробелы в команде поставлены, чтобы проще было читать; вообще, в питоне пробелы можно ставить в любом разумном месте (внутри названий команд и чисел нельзя, но около скобок, знаков препинания и прочих символов можно), но рекомендуется ставить их как минимум вокруг знаков действий.

В одной программе можно вычислять несколько выражений. Например, программа

вычисляет три выражения. Первая команда print выводит на экран две четвёрки, разделённых пробелом. Вторая команда просто выводит одно число 9. Оно будет выведено на отдельной строке, т.к. каждая команда print выводит одну строку. Обратите еще раз внимание, что аргументы команды разделяются запятыми.

Можно также, как мы видели раньше, смешивать текст (в кавычках) и выражения:

2.1.9. Простейший ввод и вывод. Переменные¶

Но не очень интересно писать программы, которые всегда выводят одно и то же. Хочется, чтобы программа что-нибудь запрашивала у пользователя, и работала с учётом того, что пользователь ввёл. Давайте, например, напишем программу, которая будет спрашивать у пользователя два числа и выводить на экран их сумму.

Но для этого нам придётся научиться ещё одной важной вещи. Когда пользователь вводит два числа, программе надо их как-то запомнить, чтобы потом сложить между собой и результат вывести на экран. Для этого у компьютера есть память (оперативная память). Программа может использовать эту память и положить туда числа, введённые пользователем. А потом посмотреть, что там лежит, сложить эти два числа, и вывести на экран.

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

Теперь разберем, как эта программа работает.

Обратите внимание, что a написано без кавычек. Если бы мы написали print("Вы ввели ", "a", "!") , то питон бы вывел просто букву a (ну и весь остальной текст), он не понял бы, что надо вывести то, что лежит в памяти a .

В программе можно заводить несколько переменных. Простейший вариант может выглядеть так:

Эта программа считывает две строки, которые вводит пользователь, и выводит их, причем сначала вторую, а потом первую.

Но мы хотели написать программу, которая выводит сумму двух чисел. Простой подход тут не сработает:

сделает вовсе не то, что вы могли ожидать: питон пока считает, что в a и b могут лежать какие угодно строки, и не понимает, что вы имели в виду числа.

Чтобы объяснить, что вы имеете в виду числа, надо написать так:

Мы используем новую команду (точнее, функцию) — int . Она обозначает: возьми то, что получилось у команды input() (т.е. ту строку, которую вводит пользователь), и преврати это в число. Пока это не надо до конца осознавать, просто запомните, что, чтобы считать одно число, надо написать . = int(input()) , где на место многоточия надо подставить имя той переменной, куда надо записать результат.

Запустите эту программу. В окошке ввода наберите какое-нибудь число, нажмите Enter, наберите второе число и еще раз нажмите Enter. Вы увидете, что программа вывела их сумму.

Чтобы вводить числа через пробел, надо использовать другую конструкцию:

Это пока магия, ее придется запомнить наизусть. Потом вы поймете, что здесь что значит. Обратите внимание, что после слова int тут нет скобок, а вот после input и split есть.

Так можно вводить сколько угодно чисел; например, чтобы считать четыре числа, вводимые в одной строке, надо написать

Переменные не обязательно называть a и b , можно использовать более-менее любые строки из английских букв и цифр (есть некоторые исключения, но пока это не так важно); например, можно было назвать переменные first и second , или x1 и x2 и т.п. Конечно, переменных можно делать столько, сколько вам понадобится; вообще, переменные — это основная вещь, с которой работают программы.

2.1.10. Присваивания¶

Пока мы умеем записывать в переменные только то, что пользователь ввел с клавиатуры. На самом деле, намного чаще приходится записывать в переменные значения, которые программа сама вычисляет. Для этого есть специальная команда, которая называется присваивание (и на самом деле мы ее уже видели):

выведет на экран 30, потому что сначала в a записывается 20, потом компьютер смотрит, что записано в a , прибавляет 10, и результат записывает в b , потом смотрит, что записано в b , и выводит на экран.

Если в переменной уже было что-то записано, то после присваивания старое значение затирается:

в результате в a лежит 30, а про 20 все забыли.

Особый интересный вариант — справа можно упоминать ту же переменную, которая стоит слева — тогда будет использоваться ее предыдущее значение:

2.1.11. Комментарии¶

(Эта информация вам прямо сейчас не нужна, но будет полезна при чтении дальнейших разделов.)

В частности, решетка может стоять в начале строки, тогда вся эта строка будет игнорироваться:

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

2.1.12. Язык программирования как конструктор¶

Выше я рассказал ряд самых основных конструкций языка питон. Теперь ваша задача будет из этих конструкций, как из конструктора, собирать программы. Относитесь к этому именно как к конструктору: все программирование — это сборка больших программ из таких отдельных команд.

2.1.13. Примеры решения задач¶

Приведу несколько примеров задач, аналогичных тем, которые встречаются на олимпиадах и в моем курсе.

Вася купил \(N\) булочек, а Маша — на \(K\) булочек больше. Сколько всего булочек купили ребята?


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

В статье я покажу вам, как опубликовать пакет Python в сервисе PyPi (Python Package Index). Именно отсюда pip загружает их для использования в проектах и инструментах командной строки, которые вы можете применить на компьютере.

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

Создадим новую структуру каталогов для нашего проекта:

sample-pypi-package — это корневой уровень проекта, и мы создаем модуль hello_world внутри него. Содержание __init__.py пусто и main.py выглядит так:

Для первого шага все. Ничего необычного, если вы знакомы с Python. main.py не нужен для этого урока, но я добавил его просто для того, чтобы у нас был файл внутри модуля.

Мы создадим новый setup.py , который действует как скрипт сборки для нашего пакета. Однако нужно будет установить setuptools через pip . Вы можете выполнить приведенную ниже команду. Помните, какая версия Python у вас, и используйте соответствующий pip .

Теперь, когда мы установили setuptools , мы можем начать настраивать setup.py :

Как упоминалось ранее, этот файл отвечает за создание дистрибутивного файла, который будет загружен в PyPi.

Две строки, которые я хочу выделить:

Я специально прокомментировал их, потому что они не нужны в этом упражнении, однако они важны, если ваш пакет имеет зависимости. Реальный проект будет иметь внешние зависимости, поэтому именно так вы добавляете их в дистрибутив, чтобы пользователь, устанавливающий ваш пакет, получил необходимое для корректной работы. Типичная практика — создание файла requirements.txt , который setup.py может читать вместо определения массива.

Если вам интересно узнать обо всех параметрах setuptools.setup() смотрите официальную документацию.

Эта часть не так увлекательна, но очень важна. Поскольку вы публикуете в мир, надо убедиться, что у вас есть соответствующая документация, а также надлежащая лицензия с открытым исходным кодом. Мы также нуждаемся в README.md поскольку используем его внутри setup.py .

Создадим простой README.md на корневом уровне проекта:

Продолжим и создадим файл LICENSE на корневом уровне с лицензией MIT:

Обязательно измените [year] и [fullname] !

Теперь, когда у нас есть LICENSE и README.md , структура каталогов должна выглядеть так:

Итак, теперь, когда пакет полностью установлен, можно генерировать дистрибутивные файлы. Это файлы, которые пользователь будет загружать и распаковывать, чтобы запустить код. Поэтому, когда вы выполните pip install с указанием пакета, то загрузите tarball/zip для распаковки на компьютере локально.

Нам понадобится еще один инструмент:

После загрузки wheel мы можем применить его для создания файлов.

Выполните эти команды в том же каталоге, где находится setup.py (это корневой каталог, если вы следуете руководству):

Терминал должен отобразить логи того, что он делает. У вас должно быть создано несколько новых каталогов, которые я выделил жирным шрифтом ниже. Загружать их в репозиторий я не буду.

Оба build и hello_world_ericjaychi.egg-info можно проигнорировать. Сосредоточимся на каталоге dist :

Это дистрибутивные файлы, которые будут выдаваться пользователям, когда они скачают их через pip .

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

Приведу примеры публикации в обеих средах.

После регистрации пришло время установить последний инструмент:

Как только twine установится, можно использовать его для загрузки пакета в PyPi. Выполните эту команду на корневом уровне проекта:

Если они не работают, поместите перед ними python или python3 .

После ввода соответствующей команды вам будет предложено ввести свои учетные данные для выбранной среды. После он покажет несколько индикаторов выполнения для загружаемых файлов:


Он даже даст вам ссылку в конце, чтобы показать, что пакет был опубликован для конкретной версии. Вот ссылки, которые были сгенерированы во время этого упражнения, представляющие TEST и PROD соответственно:


Теперь, когда мы установили пакет, проверим, что он был установлен правильно.

Откройте интерпретатор Python и импортируйте модуль hello_world , созданный в этой статье.


Наш интерпретатор должен распознать импорт без каких-либо проблем.

Поздравляю! Вы успешно опубликовали пакет Python в PyPi.

PyPi — это потрясающая платформа, которая позволяет сообществу Python с легкостью распространять код среди других пользователей по всему миру.

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

Читайте также: