Letysite.ru

IT Новости с интернет пространства
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Свою утилиту сборки проекта python

Python-сообщество

Уведомления

#1 Дек. 29, 2017 17:39:17

Сборка проекта

Случилось так, что мне необходимо написать небольшой проект на python.
Сам я в основном пишу на java. Естественно ищу схожие инструменты. Так мне понадобились аналоги maven и jar в python.
Чаще всего (как я понял) люди используют pip и zip для этого.
Т.к. pip ставит все глобально и в нем все плохо с одновременной установкой, есть еще virtualenv, и всякие там conda, anaconda, у которых тоже полно недостатков.
Есть ряд постов где pip называют уг даже заядлые python-программисты
Например, вот Почему я ненавижу virtualenv и pip

Ближе к вопросу:
Как собрать весь проект в один zip и запустить его в виде python myscritp.zip я разобрался.
Однако зависимости в нем все еще установлены через pip глобально.

Если еще в дополнение использовать virtualenv, то не понятно следующее. Как активировать virtualenv перед запуском скрипта, если зависимости будут упакованы в zip? В крайнем случае (если это задача в python не решена), откажусь от упаковки в один zip.

Также было замечено, что при использовании virtualenv под window в папки виртуального окружения все окружении (папа scripts) генерируется только под винду. Поэтому этот проект под linux не заведется (без дополнительных телодвижений и установки зависимостей) . А как же python многоплатформенность?

Есть конечно радикальный вариант — ставить каждый python проект в докер. Но неужели нельзя как-то нормально упаковывать и распространять готовые приложения. Задача-то типовая.

Мастера, помогите советом. Кто и как работает?

Еще попутный вопрос. Везде говорят что python “клей” со всеми языками хорошо связывается.
Но jpython работает только для python 2. А как же поддержка третьей версии? Десять лет уже почти прошло с момента выхода python 3.

#2 Дек. 29, 2017 17:46:22

Сборка проекта

> Т.к. pip ставит все глобально

С чего ты это взял? У него есть опция -t которая позволяет установить модуль куда нужно.

> Если еще в дополнение использовать virtualenv

Забудь про это УГ.

#3 Дек. 29, 2017 18:06:29

Сборка проекта

Спасибо за ответ.
Сделал папку lib в корне проекта. Установил зависимости в эту папку.
Что сделать в самом проекте, чтобы он дергал зависимости из этой папки?

#4 Дек. 29, 2017 18:41:21

Сборка проекта

#5 Дек. 29, 2017 20:25:32

Сборка проекта

g
Но неужели нельзя как-то нормально упаковывать и распространять готовые приложения Не думаю что люди морочатся с упаковкой в zip. Классический способ распространения для небольших проектов — создание whl файла и установка при помощи pip. Для маленького проекта необходимости класть зависимости в отдельную папку тоже нет. На то они и пакеты зависимостей чтобы быть стабильными и глобальными для данного пользователя.

Если зависимости делают ваши “друзья” которые все время эти зависимости портят то это уже часть проекта а не пакет. В этом случае достаточно иметь git и git submodules.

По поводу клея вопрос интересный. Если смотреть Дзен то задачи быть клеем не ставится. Просто оно само получается. Вообще и jython и IronPython это не питон :). Они практически не развиваются как раз по причине того что питон часто используется как клей между частями кода написанного на C/C++/Fortran и.т.п. Кто будет отказываться от возможности задействовать огромное количество эффективных библиотек ради того чтобы вызвать пару методов в JVM или CLR? Java C# Python Это не просто языки но и независимые вычислительные платформы. Связывать части java приложения на питоне довольно странная идея. Может для этого java лучше подходит? Вы не пытались написать java код для управления классами из C#? Думаю тут вам надо подробнее постановку задачи описать.

Отредактировано doza_and (Дек. 29, 2017 20:27:41)

#6 Дек. 30, 2017 07:43:06

Сборка проекта

Не думаю что люди морочатся с упаковкой в zip. Классический способ распространения для небольших проектов — создание whl файла и установка при помощи pip Загуглил “whl python”, вторая же ссылка
Python на колёсах
Цитата из этой статьи “В дальнейшем предполагается, что все действия происходят в virtualenv-окружении.”
Rodegast, считает virtualenv УГ.
К тому же python wheel еще не GA, а только wheel 0.30.0. Как-то печальненько все …

По поводу клея вопрос интересный. Если смотреть Дзен то задачи быть клеем не ставится. В дзене много чего нет. Например, ничего нет про многоплатформенность. Что теперь забыть про нее? Питон не многоплатформенный?

Связывать части java приложения на питоне довольно странная идея. Может для этого java лучше подходит? Для большинства задач java нам больше подходит, поэтому 99,9% проекта на ней. python используется как рисовалка — matplotlib, т.к нужен один хитрый график в полярной системе координат. В matplotlib этот график худо-бедно заработал только в 2017. Хотя багов в еще много и висят они по несколько лет …
github matplotlib
Используя matplotlib, сделал рисовалку на пару тысяч строк. Рисует, но не все что хотелось. Ждем исправления багов matplotlib.
Но ни в java или других языках ничего аналогичного не нашли. Поэтому пока используем matplotlib, при этом , поглядываем на js библиотеки. Пока не нашли? что нам нужно, может плохо искали …
Java и python в нашем случае тупо обмениваются данными через json файлы.
Нужна многоплатформенность и возможность быстрого переноса и запуска приложения на любой машине.

Читать еще:  Куда устанавливается флеш плеер

Для другой цели, есть еще одна сторонняя python библиотека, которая производит ряд вычислений. Планируем и ее подключить. Через файлы — не вариант. Вызовы должны проходить часто, будет адски тормозить. Есть еще варианты связать их через: socket, БД, memcached, rabbitMQ, REST и т.п.
Хочется сделать это проще, не разбираясь в прелестях реализации этого на python …

Не холивара ради … Python я не знаю. Написал эту рисовалку на пару тысяч сток. И все. Python вроде как ООП. Все python программисты говорят, что на python быстро пишется код. Но когда я передаю объект как параметр в метод другого класса (а-ля dependency injection) — автокомплит для этого объекта не работает внутри метода. Динамическая типизация! Как быстро можно писать без автокомплита для объектов-параметров функции? Не говоря уже о рефакторинге, если захотел переименовать метод, то бегай по всему проекту и переименовывай ручками, следи за тем чтобы не переименовать одноименный метод другого класса.
И да, я знаю про type hints. Тот еще костыль.
Не холивара ради. Java тоже не идеал, я не люблю в ней checked exception, реализацию которых большинство уже признало ошибкой.

#7 Дек. 30, 2017 07:52:00

Сборка проекта

Вы не пытались написать java код для управления классами из C#? Не пробовал, не было пока необходимости. Если будет — буду гуглить. Или хардкор: socket, БД, memcached, rabbitMQ, REST и т.п.

#8 Дек. 30, 2017 10:40:15

Сборка проекта

Собственно похоже у вас 2 вопроса.

Идеология и мир питона довольно сильно отличается от java наверное поэтому возникают вопросы.

1 Как сделать установку.
2 Как организовать вызовы питона из java.

По 1 я бы рекомендовал средствами ОС установить/обновить питон. Дальше 2 варианта. Если код у вас бесполезный (те нужен только в вашем проекте) то просто запустите средствами os pip -r req.txt файл где указаны требования к питону. А свои файлы или zip кладите куда хотите. Второй вариант — сделать свой пакет https://packaging.python.org/tutorials/distributing-packages/ и дальше только его и ставите, зависимости будут перечислены внутри. По поводу установки зависимостей “под себя” не беспокойтесь. В мире питона если вы поломали чужую программу обновлением пакетов означает что программа не выдержала естественного отбора. К вашему поделию кстати будут также относиться. На практике несмотря на отсутствие стандартов, полный хаос в разработке и огромное количество пакетов конфликты версий пакетов встречаются крайне редко. У нас в конторе за 5 лет разработки с интенсивным использованием чужих пакетов таких случаев не было.
По пункту 2. В вашей постановке это не python используется как клей а java как клей для питона. Я не особый специалист в java, больше приходилось переписывать код с java на python или c++. Да и питон у меня не основной язык. Если нужна производительность то boost python или cython в помощь для эмбеддинга питона в с. Получите высокую скорость и замечательную цепочку java->JNI->C->python->C. В комплекте второй сборщик мусора и проблемы при распространении поскольку это компилируемый код. Второй вариант октрыть сокет и швырять туда сюда например messagepack по самописному протоколу. БД я не рассматриваю поскольку они жутко тормозят, транзацкции и персистентность однако. А из очередей наверное Zmq а не кролик. Она пошустрее и попроще.
Средний вариант shared memory. По сети не сможете работать, с синхронизацией посложнее, но данные быстрее передаются да и натянуть питоновскую личину на заданные области памяти несложно.

Вы тут кстати сетуете по поводу некоторых особенностей питона и ссылаетесь на статьи 13/14 года. В мире питона это безнадежно устаревшие публикации. Я ставлю фильтр на 1 год и не уверен что данные все еще актуальны. Вы жалуетесь что автокомплит не работает. Он отлично работает, просто надо чтобы программа уже в памяти была а не лежала мертвым грузом на диске. Кто вам мешает одновременно выполнять программу и писать? Про рефакторинг не понял. Вроде как тоже все работает. jetbrais похоже сделала интерфейс для java и для python, другое дело что половину полей класса я получаю с удаленного компьютера через сутки после начала работы программы. Что бы вы тут рефакторингом назвали?

Языки очень разные. В проекте из 100 мегабайт исходного кода на java я бы трижды подумал вставлять ли 2000 строк кода на питоне.

Отредактировано doza_and (Дек. 30, 2017 10:54:20)

#9 Дек. 30, 2017 11:45:11

Сборка проекта

В мире питона если вы поломали чужую программу обновлением пакетов означает что программа не выдержала естественного отбора. Хороший подход, но не могу с вами согласиться. Главный принцип всегда: “Не навреди тому, что уже работает”.
На практике несмотря на отсутствие стандартов, полный хаос в разработке Интересно получается …

Отредактировано g (Дек. 30, 2017 15:52:35)

#10 Дек. 30, 2017 12:05:47

Сборка проекта

g
g
Вы жалуетесь что автокомплит не работает. Он отлично работает
используйте type hints

klen.github.io

Одна из действительно полезных вещей в python — это система скриптов установки. Любой, серьезно увлекающийся python-программированием разработчик рано или поздно сталкивается с ней. Но из-за гибкости инструментария скриптов установки, их документация весьма раздута. На текущий момент имеется набор утилит (setuptools, distutils, distribute) выполняющих одинаковые задачи.

Читать еще:  Схема сборки 3d принтера

В данной статье я на конкретных примерах покажу как создать и настроить простой python-пакет.

Наш проект будет иметь следующую функциональность:

  • Метод возвращающий строку: «Hello World!»;
  • Команда helloworld печатающая эту строку в стандартный вывод.

Создаем структуру проекта

Для начала создадим директорию для пакета. Ее минимальный набор файлов состоит из: файла дистрибьюции ( setup.py ) описывающего метаданные и python кода проекта (в нашем случае модуля helloworld).

Также, xорошим тоном считается создание в корне директории файла с описанием проекта: README.txt .

Получаем следующую структуру:

Наша корневая директория helloworld-project будет содержать мета-данные пакета и вспомогательные файлы (тесты, лицензию, документацию и т.д.), а поддиректория helloworld непосредственно сам модуль helloworld .

Теперь отредактируем файл: helloworld/core.py и добавим логику нашего приложения (получение и вывод строки «Hello World!»):

Редактируем мета-информацию (setup.py)

Заполним файл описания README.rst :

Теперь отредактируем файл setup.py :

Убедитесь, что в вашей системе доступны setuptools, в противном случае установите python-пакет distribute

Этих операций достаточно, чтобы собрать пакет дистрибьюции. Выполните команду сборки:

В случае успеха вы получите файл: dist/helloworld-1.0.tar.gz . Это полноценный, архивированный python-пакет и вы можете распространять его среди прочих разработчиков.

Виртуальное окружение

Virtualenv — пакет применяемый для создания изолированного python-окружения. Используем его для тестирования нашего проекта.

Создадим окружение env:

Команда создаст директорию env внутри нашего проекта и установит туда python, pip и distribute. Произведем в него установку нашего проекта.

И протестируем его работоспособность:

Все работает. Осталось добавить поддержку команды helloworld в консоли.

Создание команд

Для создания команды helloworld изменим файл setup.py :

В параметре entry_points мы задаем словарь с «точками вызова» нашего приложения. Ключ console_scripts задает список создаваемых исполняемых скриптов (в Windows это будут exe-файлы). В данном случае мы указали создание исполняемого скрипта helloworld при вызове которого будет запускаться метод print_message из модуля helloworld.core.

Переустановим модуль в наше окружение и проверим работу созданного скрипта (для этого прийдется активировать наше окружение):

Похоже все работает.

Работа с версиями

Номер версии важная часть любого проекта. От него зависит обновление пакетов и разрешение зависимостей. В примере выше мы указали номер версии 1.0 в файле setup.py . Более правильное решение перенести его в файл helloworld/__init__.py чтобы сделать доступным в python-коде. По существующим соглашения для хранения номера версии в модуле, используется переменная __version__.

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

Существует множество систем наименования версий в python обычно рекомендуется использовать PEP386. Можно представить, что обозначение версии состоит из номера мажорного, минорного релизов (номера багфикса при необходимости), разделенных точками. В последней части версии разрешается использовать буквы латинского алфавита. Примеры из официальной документации:

Управление зависимостями

Добавим функциональности нашему проекту. Создадим команду serve которая будет запускать вебсервер отдающий страницу со строкой «Hello world!» генерируемой нашим модулем. Для этого воспользуемся пакетом Flask.

Добавляем файл helloworld/web.py :

И файл helloworld/templates/index.html :

И опишем команду serve в файле setup.py :

Теперь в нашем проекте появилась зависимость от пакета Flask. Без его установки наше приложение не будет правильно работать. За описание зависимостей в файле setup.py отвечает параметр install_requires:

Проверим установку зависимостей обновив наш пакет и работу команды serve:

Открыв браузер по адресу http://127.0.0.1:5000 вы должны увидеть нашу страницу.

Управление файлами проекта (MANIFEST.in)

На текущий момент при сборке нашего пакета distutils включает в него только python-файлы. Необходимо включить в него файл helloworld/templates/index.html без которого проект работать не будет.

Чтобы сделать это мы должны сообщить distutils какие еще файлы надо включать в наш проект. Один из способов — это создание файла MANIFEST.in :

Данная команда указывает distutils на включение в проект всех html файлов в директории helloworld/templates .

Также придется обновить setup.py :

Теперь шаблоны будут включены в наш проект.

Создание и запуск тестов

Хорошей практикой считается создание тестов для вашего проекта. Добавим простейшую реализацию, файл tests.py :

И обновим setup.py :

Теперь мы можем произвести предварительное тестирование нашего проекта:

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

Публикация пакета на pypi.python.org

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

Все ваш проект готов к публикации. Достаточно ввести соответствующую команду:

Вы не сможете опубликовать пакет helloworld , тк данное имя проекта уже занято.

Как создать исполняемые файлы для Python (от .PY до .EXE)

Главное меню » Python » Как создать исполняемые файлы для Python (от .PY до .EXE)

Например, если у вас есть друзья или коллеги, с которыми вы хотите поделиться своей программой, или если вы хотите создать исполняемый файл, чтобы брать его с собой, не беспокоясь о настройке системы каждый раз, когда вам придется ее использовать, эта статья – то, чего вы ждали!

Для этого мы будем использовать инструмент под названием pyinstaller.

Pyinstaller отлично работает как в Windows, так и в Linux и Mac OS, и поэтому все команды, которые мы покажем вам в этой статье, будут такими же, что и вам, независимо от того, в какой операционной системе вы находитесь.

Читать еще:  Сборка 3д принтера своими руками

Также очень важно помнить, что pyinstaller не является кросс-компилятором, или, как многие из вас уже предполагали, вы можете создавать исполняемые файлы только для используемой вами операционной системы.

Если вы хотите создать файл .exe, например, а затем исполняемый файл для Windows, вы можете сделать это только из Windows. То же самое относится к файлам .app, которые можно использовать в Mac OS, и для исполняемых файлов Linux.

Процедура создания наших приложений действительно очень и очень проста: внутри виртуальной среды, которую мы используем с нашим скриптом Python, мы даем команду:

После того, как это будет сделано, мы можем использовать его как любое программное обеспечение в командной строки, точно так же, как мы устанавливаем модули через pip:

Давайте посмотрим на вывод в папке, над которой мы работаем, и увидим, что были созданы некоторые новые файлы и папки.

Единственный файл, который нам понадобится, файл, который нас интересует и который мы затем можем передать, будет находиться в папке dist.

Как видите, все работает отлично, и мы можем использовать программу без необходимости знать, как использовать Python, как его настроить, как создать виртуальную среду, установить необходимые зависимости и так далее!

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

Если вы работаете в Windows и генерируете исполняемый файл для программы с графическим интерфейсом, как в этом случае, я предлагаю вам добавить еще один вариант:

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

Мы советуем вам делать тесты и экспериментировать самостоятельно, чтобы полностью понять, что мы имеем в виду.

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

Удачного кодирования! : D

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Создаём свой пакет Python

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

Структура пакета

Файл с расширением ‘.py’ — это модуль. Вы можете создать в нём классы, функции и переменные с таким же именем, как у файла. А если в папку положить несколько модулей и создать файл ‘__init__.py’, вы создадите тем самым пакет с именем как у папки. Вот примерная файловая иерархия обычного пакета:

Сборка пакета

Теперь когда мы знаем структуру пакета, поговорим про его сборку. Самое важное здесь — конфигурационный файл ‘setup.py’. Основной смысл в нём — хранение метаданных о пакете. Вот пример такого файла:

Более подробно об этом файле можно прочитать в документации.

Указываем зависимости

Для того, чтобы с пакетом можно было работать сразу после установки, вы должны указать в его конфигурации, от каких пакетов он зависит, чтобы они были сразу же установлены. Нужно просто вставить ‘install_requires=[…]’ в функцию setup. Можно также задать версию зависимости:

Эти зависимости — общедоступные пакеты, которые можно установить с помощью утилиты pip. Но если ваши зависимости не перечислены в каталоге pypi, укажите их так:

Дополнительные файлы

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

  1. Задайте ‘include_package_data=True’
  2. Создайте файл MANIFEST.in в папке с setup.py
  3. Добавьте путь до файла в MANIFEST как ‘include /path/to/test.json’, путь при этом относительный. Также можно использовать поисковый шаблон типа ‘*.json’.
Сборка

Теперь у нас всё готово, приступаем к сборке пакета. Это значит, что мы создадим дистрибутив исходного кода (напр., tar.gz) или бинарный файл (напр., wheel). Это очень просто.

В результате у нас в папке ‘./dist’ появятся оба формата. при этом имя дистрибутива будет присвоено исходя из имени пакета и его версии.

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

Поздравляю, вы создали замечательный пакет! Теперь необходимо выложить его для общего доступа. Мы загрузим его на Pypi, поэтому в будущем можно будет его установить командой ‘pip install’.

Для начала создайте учётную запись на сайте pypi.

При этом файлы из папки ‘dist/’ выгрузятся в каталог pypi. Также вы можете явно указать только определённый файл для выгрузки. Twine это специальная утилита для работы с pypi. При первой загрузке пакета она зарегистрирует пакет в pypi.

Работа с пакетом

Теперь ваш пакет опубликован в pypi. Для его установки достаточно набрать ‘pip install my_package’, а затем в коде ‘import my_package’.

При локальной разработке пакета для его тестирования добавьте путь к нему в $PYTHONPATH. Но если вы не хотите трогать переменные окружения, установите его командой ‘pip install -e .’ из папки с пакетом.

Разработчик: java, kotlin, c#, javascript, dart, 1C, python, php.

Ссылка на основную публикацию
Adblock
detector