Как опубликовать консольную утилиту на PyPI за 1 минуту

Разработав консольную утилиту, вы решаетесь опубликовать её на PyPI. Ну правда, что может быть лучше, чем сделать её доступной через pip install? Погуглив, что для этого надо, вы, возможно, наткнётесь на единственный найденный мной пост по теме, который мало того что от 2014 года, так ещё и требует от вас создать кучу папок и файлов для совершенно ненужных (вам) вещей.



Как же решить эту задачу без лишней головной боли в 2019 году? Я уже задавался этим вопросом и поэтому, прочитав тонну документации, создал для вас этот туториал. Вот пошаговая инструкция.



1. Создайте аккаунт на PyPI (ссылка для регистрации)



2. Создайте точку входа в приложение (например, файл entry.py со следующим содержимым)



def main():
    print("It's alive!")


3. Установите poetry



curl -sSL https://raw.githubusercontent.com/sdispater/poetry/master/get-poetry.py | python
source $HOME/.poetry/env


(poetry можно установить и по-другому, например, pip install --user poetry — прим. перев.)



4. Создайте окружение



cd myproject # Перейдите в папку проекта, который будем паковать
poetry init


5. Настройте консольную команду (для этого добавьте следующие строки в появившийся файл pyproject.toml)



[tool.poetry.scripts]
APPLICATION-NAME = 'entry:main'


APPLICATION-NAME надо поменять на имя консольной команды.



6. Опубликуйте утилиту! (используйте имя пользователя и пароль из шага 1)



poetry publish --username PYPI_USERNAME --password PYPI_PASS --build


Готово! Теперь другому человеку для установки достаточно всего двух команд:



$ sudo pip install PROJECT-NAME
$ APPLICATION-NAME


Где PROJECT-NAME — это имя, которое вы дали проекту на шаге 4, а APPLICATION-NAMEэто имя команды из шага 5.






Обновление версии



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



version = "0.1.0"


И повторите шаг 6:



poetry publish --username PYPI_USERNAME --password PYPI_PASS --build





Бонус: настраиваем Travis для авто-публикации



Добавьте следующие строки в файл .travis.yml



language: python
dist: xenial
before_install:
  - curl -sSL https://raw.githubusercontent.com/sdispater/poetry/master/get-poetry.py | python
  - source $HOME/.poetry/env
install:
  - poetry install
script:
  - poetry build
deploy:
  - provider: script
    skip_cleanup: true
    script: poetry publish --username $PYPI_USER --password $PYPI_PASS
    on:
      branch: master
      python: '3.7'
      tags: true


И установите переменные окружения PYPI_USER и PYPI_PASS на travis-ci.com. После этого можно будет публиковать пакет с помощью команд:



git tag -a v1.2 # Replace version number with yours
git push --tags

Poetry: новый менеджер зависимостей в Python
В последнее время в экосистеме Python часто стали появляться инструменты для управления зависимостями. Оно понятно, стандартный pip уже не отвечает современным требованиям: неудобная работа с зависимостями, много ручной работы при подготовке пакетов, проблемы при установке и обновлении и много чего другого.

С недавних пор я начал использовать новый менеджер под названием Poetry. Именно о нём сегодня пойдёт речь.


Функциональные возможности Poetry:



  • Управление зависимостями через toml файл (прощай, requirements.txt)

  • Автоматическое создание изолированного виртуального окружения Python (теперь не нужно для этого вызывать virtualenv)

  • Удобное создание пакетов (отныне не нужно копипастить создавать setup.py каждый раз)

  • poetry.lock файл для фиксирования версий зависимостей


А особенно радует тандем при работе с pyenv. О pyenv я писал три года назад.




Установка


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






curl -sSL https://raw.githubusercontent.com/sdispater/poetry/master/get-poetry.py | python

Если установка прошла успешно, то убедиться в этом можно вызвав:


$ poetry --version
Poetry 0.12.8

Стартуем!


Создаём новый проект my-demo-project:


$ poetry new my-demo-project

Заходим в папку:


$ cd my-demo-project/
~/my-demo-project$ ls
README.rst my_demo_project pyproject.toml tests

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


[tool.poetry]
name = "my-demo-project"
version = "0.1.0"
description = ""
authors = ["Your Name you@example.com"]

[tool.poetry.dependencies]
python = "^3.6"

[tool.poetry.dev-dependencies]
pytest = "^3.0"

[build-system]
requires = ["poetry>=0.12"]
build-backend = "poetry.masonry.api"

Формат файла TOML. Раздел tool.poetry предназначен для описания проекта: название, версия, краткая информация о проекте и т.д. Далее следует tool.poetry.dependencies, именно здесь будут указаны все production зависимости. Их можно указать вручную (привет, requirements.txt), но мы так делать не будем (привет, npm!). Раздел tool.poetry.dev-dependencies предназначен для зависимостей во время разработки (привет, pytest, tox!)


Добавляем зависимости


Давайте добавим к проекту зависимость в виде Luigi.


~/my-demo-project$ poetry add luigi==2.8.0

Creating virtualenv my-demo-project-py3.6 in /home/user/.cache/pypoetry/virtualenvs
Updating dependencies
Resolving dependencies... (24.1s)

Package operations: 12 installs, 0 updates, 0 removals

Writing lock file
  - Installing docutils (0.14)
  - Installing lockfile (0.12.2)
  - Installing six (1.11.0)
  - Installing atomicwrites (1.2.1)
  - Installing attrs (18.2.0)
  - Installing more-itertools (4.3.0)
  - Installing pluggy (0.8.0)
  - Installing py (1.7.0)
  - Installing python-daemon (2.1.2)
  - Installing tornado (4.5.3)
  - Installing luigi (2.8.0)
  - Installing pytest (3.10.1)

Обратите внимание, что Poetry автоматически создал виртуальное окружение через virtualenv при добавлении пакета (т.к. ранее оно не было создано). Все окружения находятся по пути ~/.cache/pypoetry/virtualenvs


Если снова открыть pyproject.toml, то можно увидеть новую запись в разделе зависимостей:


[tool.poetry.dependencies]
python = "^3.6"
luigi = "=2.8.0"

Всю "грязную" работу за нас делает Poetry. Чтобы добавить зависимость для разработки достаточно указать флаг —dev:


$ poetry add tox --dev

Using version ^3.5 for tox
Updating dependencies
Resolving dependencies... (6.3s)
Package operations: 4 installs, 0 updates, 0 removals

Writing lock file
  - Installing filelock (3.0.10)
  - Installing toml (0.10.0)
  - Installing virtualenv (16.1.0)
  - Installing tox (3.5.3)

Смотрим содержимое pyproject.toml ещё раз:


[tool.poetry.dev-dependencies]
pytest = "^3.0"
tox = "^3.5"

Чтобы удалить зависимость нужно выполнить:


~/my-demo-project$ poetry remove luigi

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


Отныне забудьте про головную боль с ручным созданием setup.py, прописыванием туда всех зависимостей и запоминанием команд для сборки через pip. Всё стало в разы проще. Чтобы собрать python пакет выполните:


~/my-demo-project$ poetry build

Building my-demo-project (0.1.0)
 - Building sdist
 - Built my-demo-project-0.1.0.tar.gz
 - Building wheel
 - Built my_demo_project-0.1.0-py3-none-any.whl

В папке dist будут сформированы пакеты. Чтобы поделиться своим творением с другими разработчиками, например через pypi, выполните:


~/my-demo-project$ poetry publish

Окружение


Для активации виртуального окружения необходимо выполнить команду:


~/my-demo-project$ poetry shell

Вывод


Проект Poetry появился 28 февраля 2018 года, последняя версия 0.12.8. Инструмент молодой, но перспективный и быстроразвивающийся. Уже сейчас он на голову выше старичка pip и по функциональным возможностям и по удобству использования. Советую вам его попробовать и поделиться мнением в комментариях к этой статье. За более подробной информацией об инструменте советую заглянуть на сайт с документацией.



https://pypi.org/project/poetry/
https://poetry.eustace.io/docs/
Goodbye Virtual Environments?


Ставим пакеты stdeb и python-all:
$ sudo apt-get install stdeb python-all
Теперь находим архив с нужным нам модулем на pypi.python.org и скачиваем его себе:
$ wget https://pypi.python.org/packages/source/g/grab/grab-0.6.30.tar.gz
Теперь можно заглянуть в документацию на stdeb и посмотреть, как это делается.
Read more... )
http://vladimir-stupin.blogspot.ru/2013/10/deb-python.html
https://pypi.python.org/pypi/stdeb
https://blog.truecrux.org/post/xxxiii

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

Read more... )
http://ishalyapin.ru/собираем-питоновский-пакет-и-выклады/




развернуть
Время от времени, я пишу небольшие утилиты, библиотеки и приложения на python для себя, и не всегда я готов делится этими утилитами и библиотеками, но хотелось бы иметь возможность их удобно устанавливать, и желательно привычным pip в virtualenv. Для этого я довольно давно организовал себе локальный, приватный pypi сервер. Реализаций локальный pypi серверов довольно много, и я перепробовал их все. Большинство из них откровенно неработающие, другие безбожно глючат и падают от малейшего чиха. В конечном итоге для себя я выбрал localshop. В этом небольшом посте я расскажу как настроить локальный, приватный pypi репозиторий на localshop.

Для любителей docker: да, есть ardeois/docker-localshop. Можете поставить его сразу из docker hub, но мне docker не всегда подходит.

Ставим всё необходимое:



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

Из под обычного пользователя создаём виртуальное окружение и активируем его:
cd /home/$USER
virtualenv localshop
cd localshop
source bin/activate
pip install localshop
localshop migrate

Настроим supervisor для запуска localshop. Создадим /etc/supervisor/conf.d/ localshop.conf:



Выше $USER нужно заменить на имя пользователя, под которым Вы развернули virtualenv с localshop.

Запустим:



Теперь настроим nginx. Создадим /etc/nginx/sites-available/localshop :



В листинге выше $USER так же нужно заменить на пользователя в директории которого разместили виртуальную среду с localshop.
Активируем конфигурацию nginx:



Скажем systemd запускать supervisor и nginx при старте системы:



После этого заходим по адресу, по которому разместили localshop. В нашем примере - это http://localshop.yourdomain.com. Перед нам откроется главная страница localshop:



Далее в верхнем меню выбираем Permissions, затем CIDRs и нажимаем Create. На странице добавления необходимо добавить IP-Адрес, или сеть из которой будет доступна возможность добавлять пакеты. В моём случае это сеть 192.168.1.0/24. Обращаю внимание, что добавлять необходимо в CIDR нотации. Например, /24 в CIDR нотации - это маска 255.255.255.0. Подробнее можно почитать, например, на википедии.



После добавления:



В localshop в отличии от многих других приватных pypi можно каждому пользователю давать разные ключи для доступа, и при надобности отключить пользователя. Добавим один ключ. Для этого так же в меню выбираем Permissions, затем Credentials и нажимаем Create. Localshop автоматически сгенерирует ключ:



Пользователи имеющие доступ к самому localshop создаются отдельно. Для кого-то это может показаться неудобным, для себя же я нашёл это весьма удобным решением.

Теперь необходимо настроить pip таким образом, чтобы он позволял использовать наш приватный pypi вместе с основным.
Откроем файл ~/.pypirc расположенный в домашней директории пользователя, из под которого планируется использовать localshop, и приведем к примерно такому виду:



Пользователя и пароль для localshop находятся на странице Credentials. Там же можно добавить ключ, если на ранних шагах не добавили.
Теперь можно скачивать и закачивать пакеты через наш приватный сервер:



Но чтобы каждый раз не указывать его, можно назначить его используемым по-умолчанию. Для этого в домашней директории откройте файл: ~/.pip/pip.conf (создайте если его нет), и добавьте следующее:



Где access_key - это Access Key со страницы Credentials, secret_key - secret key с той же страницы.


https://the-bosha.ru/2016/03/21/razvorachivaem-lokalnyiy-pypi-s-localshop/



развернуть
испробовав разные способы я нашёл этот самым оптимальным
при установке через pip3 возникла ошибка:

TypeError: unsupported operand type(s) for -=: 'Retry' and 'int'

причиной оказалась "докембрийская свежесть" пакета:
http://stackoverflow.com/questions/37495375/python-pip-install-throws-typeerror-unsupported-operand-types-for-retry

поначалу возникло желание собрать свой пакет с помощью stdeb

Ставим пакеты stdeb и python-all:
# apt-get install stdeb python-all
Теперь находим архив с нужным нам модулем на pypi.python.org и скачиваем его себе:
$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
или
$ wget https://bootstrap.pypa.io/get-pip.py
Теперь можно заглянуть в документацию на stdeb и посмотреть, как это делается.

Распакуем скачанный архив:
$ tar xzvf grab-0.4.12.tar.gz
Перейдём в каталог с распакованным модулем:
$ cd grab-0.4.12
Подготовим каталог и управляющие файлы для сборки пакета:
$ python setup.py --command-packages=stdeb.command sdist_dsc
Теперь перейдём в этот каталог и соберём пакет:
$ cd deb_dist/grab-0.4.12
$ dpkg-buildpackage -us -uc -rfakeroot
В каталоге выше появится готовый deb-пакет, который можно установить в систему.
# dpkg -i python-grab_0.4.12-1_all.deb

http://vladimir-stupin.blogspot.ru/2013/10/deb-python.html

sudo apt-get install python-stdeb
.....
но свежее окружение проще поддерживать стандартными средствами python, чем самому постоянно ваять пакеты ), посему вбил в консоль это и получил нужный мне результат:
sudo apt-get remove python-pip python3-pip
export https_proxy=http://user:password@proxy-server:port  ; export http_proxy=http://user:password@proxy-server:port  ; export ftp_proxy=$http_proxy
wget https://bootstrap.pypa.io/get-pip.py
curl -O https://bootstrap.pypa.io/get-pip.py
sudo python3 get-pip.py
если ImportError: cannot import name 'sysconfig'
sudo apt-get install python3-distutils
pip install -U pip
pip install -t $HOME/devs/lib/virtualenv virtualenv
chmod +x $HOME/devs/lib/virtualenv/virtualenv.py (для старых версий)
ln -s $HOME/devs/lib/virtualenv/virtualenv.py $HOME/bin/virtualenv  (для старых версий)
ln -s $HOME/devs/lib/virtualenv/bin/virtualenv $HOME/bin/virtualenv
echo 'export PYTHONPATH="$HOME/devs/lib/:$PYTHONPATH"' >> $HOME/.profile  (или в $HOME/.bashrc)
cd $HOME/devs/virt
virtualenv -p python3 newenv1
source $HOME/devs/virt/newenv1/bin/activate
pip install django
pip install django-admin-tools
django-admin startproject django1
cd django1/
sed -i 's/LANGUAGE_CODE = \x27en-us\x27/LANGUAGE_CODE = \x27ru-ru\x27/' django1/settings.py
python manage.py migrate
python manage.py createsuperuser
x-www-browser 'http://0.0.0.0:8080/admin' &
python manage.py runserver 0.0.0.0:8080


https://packaging.python.org/guides/installing-using-pip-and-virtual-environments/
python3 -m pip install --user virtualenv
python3 -m venv env
source env/bin/activate
deactivate
python3 -m pip install requests

https://docs.python.org/3/tutorial/venv.html
python3 -m venv tutorial-env
source tutorial-env/bin/activate


ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
launchpadlib 1.10.13 requires testresources, which is not installed.

sudo apt install python3-testresources

если надо какая нибудь определённая версия Django, то
pip install Django==1.8.18

PS
следуя талмуду http://djbook.ru/rel1.9/intro/
я вводил всякие команды типа

python manage.py startapp polls
python manage.py makemigrations polls
python manage.py migrate
python manage.py check
python manage.py migrate --run-syncdb

и правил конфиги, как в букваре, пока не столкнулся с ошибкой:

    url(r'^polls/', include('polls.urls')),
NameError: name 'include' is not defined

вылечилось добавлением этой строки, в файле urls.py, перед urlpatterns

from django.conf.urls import include

в старых версиях лечило

from django.conf.urls.defaults import *

Django 1.9 Flatpages, как настроить URLS?
http://python.su/forum/topic/7746/?page=1#post-51255

быстро подправить базу
python manage.py dbshell
или
sudo add-apt-repository -y ppa:linuxgndu/sqlitebrowser
sudo apt-get install sqlitebrowser

чтобы PyCharm в virtualenv нормально ставил пакеты через proxy:
надо создать файл pycharm, написать в нём:



положить его в папку $HOME/bin и дать права на выполнение chmod +x
сам архив с программой распаковать в $HOME/lib

---------------------------------------------------------------------------

Flatpages App

1) устанавливаем. как написано тут
https://djbook.ru/rel1.9/ref/contrib/flatpages.html

в settings.py:
INSTALLED_APPS 
    'django.contrib.sites',
    'model1',                    # подключаемая модель
    'django.contrib.flatpages',

MIDDLEWARE добавить прослойку
    'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware',


SITE_ID = 7 # цифра = № сайта. созданного в админ панели, узнать номер можно переходом на этот сайт (№ в адресной строке)

urls.py



2) создаём модель
django-admin.py startapp model1
python manage.py migrate

3) создаём в модели папки:
templates, а в ней папку flatpages, в которой создаём файл default.html
как указано тут
https://simpleisbetterthancomplex.com/tutorial/2016/10/04/how-to-use-django-flatpages-app.html




или напр. так



удобный визуальный редактор

https://github.com/ITCase-django/django-tinymce-4

pip install django-tinymce-4
в settings.py

INSTALLED_APPS = (
    'tinymce_4',
    'grappelli',
    'filebrowser',
    'django.contrib.admin',
)

в urls.py

url(r'^grappelli/', include('grappelli.urls')),
url(r'^admin/', include([
    url(r'^', include(admin.site.urls)),
    url(r'^filebrowser/', include(fb_site.urls)),
])),

в models.py

from tinymce_4.fields import TinyMCEModelField
from django.db import models

class ModelFoo(models.Model):
    content = TinyMCEModelField('Foo content')

напр в

$HOME/devs/virt/newenv3/lib/python3.4/site-packages/django/contrib/flatpages/models.py

добавить
from tinymce_4.fields import TinyMCEModelField

а
content = models.TextField(_('content'), blank=True)
заменить на
content = TinyMCEModelField(_('content'), blank=True)

https://djbook.ru/forum/topic/1101/

---------------------------------------------------------------------------

напоминание о читабельном коде

$ pip3 install pep8
$ pep8 optparse.py
$ pip3 install autopep8
$ autopep8 --in-place optparse.py
---------------------------------------------------------------------------

Быстрый старт
---------------------------------------------------------------------------
работа с virtualenv

$ git clone https://github.com/username/projectname.git
$ cd projectname
$ virtualenv -p python3 venv
$ source venv/bin/activate
(venv)$ pip install -r requirements.txt
---------------------------------------------------------------------------

cd $HOME/devs/virt
virtualenv -p python3 newenv3
source $HOME/devs/virt/newenv3/bin/activate
pip install --upgrade pip
pip install djangocms-installer # и это подтянет всё остальное по зависимостям, в т.ч и django нужной версии )
pip freeze > requirements.txt
mkdir tutorial-project
cd tutorial-project
djangocms -f -p . mysite
python manage.py createsuperuser
python manage.py runserver

в settings.py

SITE_ID = 2 # чтобы создать ещё сайт, (кроме того что в шаблоне по умолчанию, цифра - количество сайтов)

затем
python manage.py migrate

войти, создать сайт, папку, загрузить туда рисунки, создать фрагмент с фоновым рисунком, создать страницу

затем
dumpdata и loaddata чтобы сдампить одну базу в JSON и восстановить дамп уже на другой базе.

добавление bootstrap3
pip install aldryn-bootstrap3
python manage.py migrate
python manage.py collectstatic
подробно см тут
https://github.com/aldryn/aldryn-bootstrap3

вариант
https://github.com/dyve/django-bootstrap3

http://docs.django-cms.org/en/release-3.4.x/introduction/install.html
http://docs.django-cms.org/en/latest/introduction/index.html
Index of Packages Matching 'djangocms'
https://cdnjs.com/libraries (подключаемые библиотеки )
Как растянуть фон на всю ширину окна?
неподвижный фон при прокрутке страницы html
Как добавить фоновый рисунок на веб-страницу?
Перевод первой части документации Django-CMS
Вторая часть документации по Django CMS
Создание сайта на Django CMS

---------------------------------------------------------------------------

Работа с pip

$ pip help # помощь по доступным командам.
$ pip install package_name # установка пакета(ов).
$ pip install Django==1.8.18 # установка определённой версии пакета.
$ pip uninstall package_name # удаление пакета(ов).
$ pip-autoremove package_name # удаление пакета(ов), с установленными зависимостями
$ pip install -U # обновление пакета(ов).
$ pip install --force-reinstall # при обновлении, переустановить пакет, даже если он последней версии.
$ pip list # Смотрим на список установленных (доступных) библиотек
$ pip list -o # узнать, какие библиотеки можно обновить
$ pip show package_name # узнать версию, местонахождение на диске и зависимости.
$ pip search pycp # покажет список всех пакетов, в названии которых есть pycp
$ pip --proxy user:passwd@proxy.server:port # использование с прокси.
$ pip completion --bash >> ~/.bashrc # Автодополнение
http://asvetlov.blogspot.ru/2014/05/pip.html

Как обновить существующие пакеты? (пользоваться осторожно, лучше в virtualenv )

$ pip install pip-review
$ pip-review --local --interactive
или
$ pip freeze --local | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 pip install -U
http://python.cx/blog/article/3
http://xgu.ru/wiki/Работа_с_модулями_в_Python

Удаление ненужных пакетов

$ pip install pip-autoremove
$ pip install Flask Sphinx
$ pip-autoremove Flask Sphinx -y
http://python.cx/blog/article/PyPi_pip_python

При сборке собственных пакетов нужно записать все текущие установленные пакеты в файл с именем requirements.txt
$ pip freeze > requirements.txt

Команда pip установит перечисленные зависимости, переопределяя зависимости, указанные в подпакетах, в том случае, если возникли конфликты.
$ pip install -r requirements.txt


---------------------------------------------------------------------------------

virtualenverapper
http://www.unix-lab.org/posts/virtualenv/
https://russianpenguin.ru/tag/python/

$ sudo apt install virtualenvwrapper

Добавляем в .bashrc

export WORKON_HOME=~/.envs
source /usr/bin/virtualenvwrapper.sh

Применяем изменения
$ source .bashrc

Теперь можно создавать окружения.
$ mkvirtualenv proj_env

Активировать окружения.
$ workon proj_env

Выходить из окружения
$ deactivate

Удалять окружения.
$ rmvirtualenv proj_env

При этом все папки окружений будет расположены в одном месте: папке, которая задана через $WORKON_HOME.

---------------------------------------------------------------------------------

вариант с pyenv (удобно)
https://github.com/pyenv/pyenv-installer
Менеджер версий python
Скрипт создаст указанную директорию, вместе со всеми родительскими директориями, если потребуется, и построит виртуальное окружение.

средствами OS
$ sudo apt-get install python3-venv
$ python3 -m venv $HOME/devs/virt/newenv1
$ pyvenv $HOME/devs/virt/newenv1
$ source $HOME/devs/virt/newenv1/bin/activate

автономная установка (предпочтительней)
Управляем разными версиями python

sudo apt install git




перезапустить оболочку
$ exec "$SHELL"

Обновление:
$ pyenv update

Удаление:
$ rm -fr ~/.pyenv
и убрать из .bashrc строки (или заккоментить #)

export PATH="~/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

перезапустить оболочку
$ exec "$SHELL"

если
WARNING: `pyenv init -` no longer sets PATH
то убрать из .bashrc и добавить в .profile
https://github.com/pyenv/pyenv

echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.profile
echo 'eval "$(pyenv init --path)"' >> ~/.profile

Использование:
$ pyenv
$ pyenv versions
$ pyenv install 3.6.3
$ pyenv versions
$ pyenv global 3.6.3
$ python --version
$ pyenv global 2.7.13

~$ mkdir my-project && cd my-project
~/my-project$ python -V # версия python по-умолчанию
Python 2.7.13
~/my-project$ pyenv local 3.6.3 # меняем версию для директории my-project
~/my-project$ python -V # новая версия
Python 3.6.3
~/my-project$ cd ..
~$ python -V # для остальных директорий ничего не поменялось
Python 2.7.13
~$ ls -la ./my-project
-rw-rw-r-- 1 user user 10 ноя 8 17:18 .python-version
~$ cat ./.python-version
3.6.3

Если в ходе установки в консоли появятся ошибки
значит в системе установлены не все необходимые пакеты. Исправим это, выполнив



если ошибка ModuleNotFoundError: No module named '_lzma'
то
sudo apt-get install lzma
sudo apt-get install liblzma-dev
sudo apt-get install libbz2-dev

Виртуальное окружение
Добавить плагин легко, просто клонируем его из репозитория pyenv-virtualenv или pyenv-virtualenvwrapper:



Пример использования

$ pyenv versions
* system
2.7.5
3.3.2

$ mkdir -p ~/test_project/prj_for_2.7.5 && cd ~/test_project/prj_for_2.7.5
$ pyenv virtualenv 2.7.5 my-virtualenv-2.7.5
$ pyenv local my-virtualenv-2.7.5
$ pip install django==1.4
$ pip freeze
Django==1.4
wsgiref==0.1.2
$ python --version
Python 2.7.5

$ mkdir -p ~/test_project/test_project && cd ~/test_project/test_project
$ pyenv virtualenv 3.3.2 my-virtualenv-3.3.2
$ pyenv local my-virtualenv-3.3.2
$ pip install django==1.5
$ pip freeze
Django==1.5
$ python --version
Python 3.3.2

самый правильный способ
$ pyenv virtualenv virt3.6.3
$ pyenv virtualenvs
$ pyenv shell virt3.6.3
$ pyenv activate virt3.6.3
$ pyenv deactivate
$ pyenv uninstall virt3.6.3

проверка как работает
$ pyenv install 3.6.4
$ pyenv virtualenv virt3.6.4
$ pyenv activate virt3.6.4
$ pip install gunicorn httpbin
$ gunicorn httpbin:app
$ pyenv deactivate
$ pyenv uninstall virt3.6.4
$ pyenv virtualenvs
$ pyenv uninstall 3.6.4
$ pyenv versions



---------------------------------------------------------------------------------

Представляем Pipenv!
https://pypi.org/project/pipenv/
https://pypi.org/project/pipsi/


автоматическая активация виртуальных окружений

https://github.com/kennethreitz/autoenv
https://nolar.info/automatically-activate-virtualenv-on-cd/
https://gist.github.com/nolar/9702618
http://hmarr.com/2010/jan/19/making-virtualenv-play-nice-with-git/
https://github.com/utahta/pythonbrew

http://itnovella.ru/itnovella/2014/01/16/nastroyki-proksi-v-debian-gnu-linux.html
http://pythonworld.ru/osnovy/pip.html
https://pip.pypa.io/en/stable/reference/pip_install/#pip-install-options
https://qa.mchost.ru/q/ustanovka-bibliotek-python-v-domashniy-katalog
http://askubuntu.com/questions/250929/pythonpath-environment-variable
«pip -t» — простая альтернатива virtualenv
Создание deb-пакетов для модулей Python
http://snakeproject.ru/rubric/article.php?art=django19p01
http://defindit.com/ascii.html
Одно-строчные скрипты SED - Ant0
Полезные одно-строчные скрипты sed (sed shell)
http://asvetlov.blogspot.ru/2014/05/pip.html
http://python.cx/blog/article/PyPi_pip_python
http://eax.me/python-virtualenv/
Питон в коробке – venv в python 3.3
https://docs.python.org/dev/library/venv.html
https://khashtamov.com/2015/12/pyenv-python/
http://proft.me/2010/04/3/python-i-okruzhenie-virtualenv/
https://russianpenguin.ru/2015/04/05/разработка-на-python-с-использованием-virtualenv/
http://virtualenvwrapper.readthedocs.io/en/latest/command_ref.html
Современный Python: как начать свой проект с нуля при помощи Pyenv и Poetry

Установка Django CMS в Ubuntu 16.04 64bit
Ленивый деплой Django проекта UWSGI + NGINX (UBUNTU 20.04)
How To Set Up Django with Postgres, Nginx, and Gunicorn on Ubuntu 20.04
Запуск Django сайта на nginx + Gunicorn + SSL
Настройка Debian, Nginx и Gunicorn для Django проекта

https://www.sinyawskiy.ru/feincms.html
http://vits.pro/info/django-cms/
http://cultofdigits.com/articles/django-cms/
12 не годных cms или как я выбирал нам cms на python — и ничего не выбрал.

uzverss Установка веб-фреймворка Django в Ubuntu
uzverss консоль python в роли командной строки

Profile

uzverss: (Default)
uzverss

December 2024

S M T W T F S
12345 67
891011121314
15161718192021
22232425262728
293031    

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jun. 22nd, 2025 04:27 am
Powered by Dreamwidth Studios