Уведомления

Группа в Telegram: @pythonsu

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

g
Зарегистрирован: 2017-12-29
Сообщения: 11
Репутация: +  1  -
Профиль   Отправить e-mail  

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

Случилось так, что мне необходимо написать небольшой проект на 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

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2832
Репутация: +  186  -
Профиль   Отправить e-mail  

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

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

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

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

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



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

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

g
Зарегистрирован: 2017-12-29
Сообщения: 11
Репутация: +  1  -
Профиль   Отправить e-mail  

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

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

Офлайн

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

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2832
Репутация: +  186  -
Профиль   Отправить e-mail  

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

 import sys
sys.path.insert(0, "lib")



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

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

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

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

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

g
Зарегистрирован: 2017-12-29
Сообщения: 11
Репутация: +  1  -
Профиль   Отправить e-mail  

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

Не думаю что люди морочатся с упаковкой в 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

g
Зарегистрирован: 2017-12-29
Сообщения: 11
Репутация: +  1  -
Профиль   Отправить e-mail  

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

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

Офлайн

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

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

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

Собственно похоже у вас 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
Зарегистрирован: 2017-12-29
Сообщения: 11
Репутация: +  1  -
Профиль   Отправить e-mail  

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

В мире питона если вы поломали чужую программу обновлением пакетов означает что программа не выдержала естественного отбора.
Хороший подход, но не могу с вами согласиться. Главный принцип всегда: “Не навреди тому, что уже работает”.
На практике несмотря на отсутствие стандартов, полный хаос в разработке
Интересно получается …
 В вашей постановке это не python используется как клей а java как клей для питона.
Это понятно. Jython работает в обе стороны Python -> Java и Java -> Python.
Jython book
Но работает только для python 2.
Вы тут кстати сетуете по поводу некоторых особенностей питона и ссылаетесь на статьи 13/14 года. В мире питона это безнадежно устаревшие публикации.
Прошло 10 лет с выхода python 3, до сих пор не все могут перебраться на него.
World Of Tanks, например, не знаю как у них сейчас, но вот видео 2013 года (5 лет после релиза 3го)
Wargaming - Беглый обзор внутренностей интерпретатора Python
Вы жалуетесь что автокомплит не работает. Он отлично работает
 #x  - экземпляр другого класса (не тот же что и self), MyObject2
class MyObject:
    def method(self, x):
        x.#как получить автокомплитом методы для объекта класс которого мы не знаем?  Тип может быть любой, и он определяется в рантайме.
//На java
class MyObject {
void method(MyObject2 x){
x.method2(); //Автокомплит прекрасно работает, т.к. на этапе компиляции известен тип MyObject2
//Про рефакторинг: прямо здесь можно переименовать метод - метод автоматически переименуется в классе MyObject2, и во всех других где он используется.

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

Офлайн

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

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

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

g

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



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version