• VLMI - форум по обмену информацией. На форуме можете найти способы заработка, разнообразную информацию по интернет-безопасности, обмен знаниями, курсы/сливы.

    После регистрации будут доступны основные разделы.

    Контент форума создают пользователи, администрация за действия пользователей не несёт ответственности, отказ от ответственности. Так же перед использованием форума необходимо ознакомиться с правилами ресурса. Продолжая использовать ресурс вы соглашаетесь с правилами.
  • Подпишись на наш канал в Telegram для информации о актуальных зеркалах форума: https://t.me/vlmiclub

Авторская статья Black Python - 1. Экскурс

gh0st4ge

Местный
Сообщения
40
Реакции
86
0 руб.
Доброго времени суток, мои юные хакеры.
Порадую Вас несколькими статьями на тему злокодинга на языке python, и для полноты картины в данной статье расскажу про некоторые базовые, часто полезные вещи при работе с Python.
bp.png

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

Освещать буду такие темы, как:
  • Установка Python 3.7
  • Настройка виртуального окружения
  • Общие советы по оформлению кода
  • Система контроля версий (VCS) - git
  • Получение exe файла

Приступим к делу.


Для программирования на питоне нам потребуется следующий инструментарий (доступен на linux, windows, mac):
  • - Интерпретатор python (3.7.1):
python_download.png
В принципе, достаточно только python 3.7, но встроенная в него IDE не удобна, поэтому дополнительно я использую Atom и PyCharm.​

  • - PyCharm Community Edition (2018.3)
py_charm_download.png
Полноценная среда разработки с кучей полезных инструментов и функций: debugger, terminal, виртуальное окружение, поддержка VCS, быстрый переход по связанным модулям - это малая часть вещей, которые облегчают разработку проектов любой сложности.​

  • - Atom (1.33.0)
atom_download.png
Подсветка синтаксиса, древовидная структура проекта, поддержка системы контроля версий, (удобный поиск, дизайн, дополнения и тд).​

Для Windows скачиваем по ссылкам интерпретатор и для комфортного кодинга PyCharm и Atom. При установке python 3.7 ставим галочку на 'Add Python to PATH' и выбираем 'Customize installation'.
python_install_1.png
Во втором окне оставляем все по-умолчанию(выбраны все пункты), а в третьем добавляем пункт 'Install for all users'.
python_install_2.png
python_install_3.png
Во время установки PyCharm, везде next, за исключением окна 'Install Options' я выбрал все пункты кроме ярлыка для 32-битной версии - 'Add launchers dir to the PATH', 'Download and install JRE', 'Associate py', 'Add Open Folder as Project', '64-bit launcher shortcut'.
py_charm_install_1.png
Для работы atom может потребоваться .NET Framework 4.5, он сам скачается перед установкой программы.
После всех установок перезагружаем систему.

Для проверки правильности установки в командной строке пишем 'python', в случае успеха должен запустится интерпретатор.
first_launch.png
Если этого не произошло, то, вероятно, в системе не прописались пути. Вручную пути (к папкам python37-32, python37-32\Scripts) добавить можно в 'Компьютер'->'Свойства'->'Дополнительные параметры системы'->'Переменные системы'->'Path'->'Значение переменной'.
add_path.png

Для linux используем терминал - все есть в репозиториях.
Код:
      sudo -i
      apt-get install python
      snap install pycharm-community
      apt-get install atom

Код:
sudo -i
pacman -S python
pacman -S pycharm-community-edition
pacman -S atom

Во время написания программ, нам часто нужны будут различные модули, которые отсутствуют в системе. Для их установки
используется встроенный механизм pip. Но, если мы будем устанавливать библиотеки прямо в систему, то при портировании проекта на другую машину могут возникнуть проблемы с выполнением кода - например, в целевой системе другая версия модуля или он отсутствует, и программа выполнется не так как задумано(если запустится). Для избежания подобных
ситуаций принято использовать виртуальное окружение (механизм venv).
При создании окружения, интерпретатор с базовыми библиотеками копируется в отдельную папку (рекомендуется положить к проекту), и при запуске кода вызывается локальный python. Если вы что-то сломаете, или установите лишние модули, то виртуальное окружение можно быстро переустановить.

Создание окружения:
В командной строке (находясь в папке с проектом):
Bash:
  python -m venv env - создание
  call env\Scripts\activate - активация
  deactivate - выйти из окружения

Находясь в активированном окружении можем устанавливать модули локально, не засоряя систему.
Команды для работы с модулями:

Bash:
pip freeze - показать установленные библиотеки
pip install <библиотека> - установить
pip uninstall <библиотека> - удалить
venv.png

Также, важно держать файл с установленными библиотеками под рукой:
pip freeze > requirements.txt

При портировании проекта приложите requirements.txt к файлам проекта (папку env не нужно, только список txt).
На целевом компьютере создайте окружение, и выполните команду:
pip install -r requirements.txt
И все прописанные в файле модули нужных версий установятся в новое окружение.

Используя venv, вы всегда контролируете какие библиотеки необходимы (+достаточно) для корректной работы программы.

PyCharm сам следит за виртуальным окружением, облегчая некоторые аспекты работы с ним. При создании проекта выберите пункт 'New environment using'.
При первом запуске проекта(нового или скопированного), убедитесь, что путь прописан правильно:
'File'->'Settings'->'Project'->'Project Interpreter'.
Для добавления окружения, нажмите на шестеренку->'Add' и выберите создание нового или использование существующего (выбирать нужно 'env\Scripts\python.exe').
venv_py_charm.png
Если окружение не создано, PyCharm сообщит, что не может выполнить код программы, и сам предложит исправить это, отправив вас в настройки.
В терминале PyCharm'а <alt+F12> не забывайте периодически обновлять список requirements.txt. Если каких то библиотек не установлено в окружении, но есть в списке txt, то PyCharm также сообщит, что нужно установить или удалить из списка.

Разрабатывая приложения, иногда ВНЕЗАПНО возникают ошибки в тех местах кода, в которых раньше ошибок не было, и по памяти восстановить их не всегда удается. А если проект разрабатывается не одним человеком, то и подавно. Или в ситуациях, когда нужно держать несколько версий проекта, не разрабатывать же их отдельно(в отдельных папках). Тогда изменение ошибок может превратиться в адскую рутину - исправлять то придется в каждом проекте.
В данном случае спасает система контроля версий. Она в отдельной папке хранит все изменения вашего проекта. Можно откатиться к работающей версии, создать ветку для экспериментов и не боятся что-то сломать, хранить разные версии приложения в одном проекте, и при необходимости работать над одной или вносить исправления сразу в несколько.

Наиболее популярная VCS - git (наверняка слышали про github). Лично я работал с git и mercurial и могу сказать, что достаточно понять механизмы работы с системой и трудностей переучиться не возникнет. Подробно рассказывать не буду, но краткую выжимку постараюсь дать.

Скачиваем на официальном сайте и устанавливаем (windows):
https://git-scm.com
git_download.png

- kali, mint, ubuntu:
sudo apt-get install git
- arch, manjaro:
sudo pacman -S git

Проект подключенный к VCS называется репозиторием. Чтобы создать репозиторий выполним простые действия:
Запускаем командную строку(в папке с проектом):
git init - инициализация репозитория
Сейчас он пуст, даже если в папке есть файлы.
git status - показать состояние репозитория
Если файлов нет, то система сообщит, что изменений не найдено. Давайте создадим файл run.py. При проверке статуса, система обнаружит изменение и предложит добавить файл в репозиторий.

Bash:
git add run.py - добавить файл
git add * - добавить все файлы
git_1.png
Файл добавлен, но не учтен, нужно сделать запись о наших изменениях:
git commit -m "сообщение" - Записать изменения с сообщением. Без флага 'm' git отправит вас в vim редактор, поэтому лучше сообщение писать сразу.

Если это первый репозиторий git, то система выдаст ошибку: 'Please tell me who you are'. Чтобы познакомиться с ним, введем команды, которые он нам предлагает:

Bash:
git config --global user.email "email"
git config --global user.name "name"
Теперь можем закоммитить (внести в базу изменения) добавленный файл.
git commit -m "сообщение"
Проверяем статус - нет изменений, которые можно внести, значит все получилось.
git log --all - просмотр всей истории
git_2.png

Изменим файл run.py, закоммитим и посмотрим историю - как результат две записи.
https://vlmi.top/attachments/git_3-png.17055/?hash=4d67ca01ad388d21d8a957c3ba35cdb1
Желтым текстом - hash коммита. По нему можем откатить изменения.
Head - где мы находимся сейчас в истории изменений.
master(зеленым) - ветка в данном коммите.

git checkout <hash> - перейти к коммиту hash
Если перейдем к первому коммиту, содержание файла сотрется, так как в тот момент времени он был пуст. Вернуться обратно
можно той же командой, поменяв hash на второй коммит

Код:
  git branch - показать ветки
  git branch <name> - создать ветку name
  git checkout <name> - перейти к ветке name
  git checkout -b <name> - создать и перейти в ветку name
git_4.png
Скачивать репозиторий с gihub:
git clone <url> <dir>

PyCharm и atom из коробки умеют работать с системами контроля версий. Если мы откроем проект, в котором VCS уже есть, то это отобразится в IDE. Всю работу с репозиторием можно выполнять прямо в PyCharm:
<ctrl+k> - внести изменения
<ctrl+shift+`> - работа с ветками
<alt+9> - перейти к вкладке VCS (логгирование, возврат к коммитам, и тд)

Не все файлы, которые хранятся в папке с проектом должны быть в репозитории. Например, виртуальное окружение, временные файлы созданные автоматически и тд. Для того, чтобы исключить файлы и папки, их нужно внести в файл '.gitignore', который располагается на одном уровне с папкой '.git'. Автоматически это можно сделать при очередном коммите, в диалоговом окне правой кнопкой мыши щелкнуть по списку файлов и выбрать пункт ignore.
В начале ведения репозитория файл .gitignore у меня всегда такого вида:
.idea
env​
__pycache__​
Теперь git не будет предлагать вносить в репозиторий файлы окружения и временные файлы

Для минимальной работы, этого, возможно, хватит, однако настоятельно рекомендую пройти полноценный курс по Git:
https://stepik.org/course/3145
https://stepik.org/course/4138
https://learngitbranching.js.org

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

Рекомендации PEP8
Для языка Python существует множество руководств по написанию кода, и PEP8 самое популярное и основное из них. Ключевым автором этого стандарта является разработчик языка Python - Гвидо ван Россум. Он считал, что код чаще читается, чем пишется (аналог мнения о разработке-поддержке кода), поэтому необходимо соблюдать некоторые правила для более простого и быстрого понимания кода вне зависимости от того, кто написал его. В этом документе определены стили многих аспектов разработки программ:
Внешний вид кода - отступы, длина строки, количество пустых строк, где ставить пробелы в коде, как писать комментарии. Подробные описания именования переменных, функций, модулей и так далее. Общие рекомендации. В PyCharm сочетание клавиш <ctrl+alt+l> - автоматически выровнит код в соответствии с PEP8, также может оптимизировать импорты и тд.


Дзен Python
Набор правил, соблюдение которых практически гарантирует быструю и понятную разработку программных решений. Изучите и следуйте им:
dzen.png

Изучайте best practices
Best practices(лучшие практики) - идеи реализаций различных методов, функций. Чаще всего решения выглядят проще или лаконичнее, чем очевидные(решения в лоб). Ищите best practices, читайте форумы, изучайте репозитории, находящиеся в свободном доступе.

Разделяйте код на функции, модули, классы
Читать и исправлять ошибки в коде, написанным сплошным текстом как минимум сложно, а иногда невозможно без замены больших частей кода.​
Поэтому к правилам хорошего разработчика относится разделение кода на небольшие части связанные по смыслу и назначению.​
Для начала, начните код с подобной конструкции:​
Python:
def main():
    pass
if __name__ == '__main__':
    main()

Инструкция "if __name__ == '__main__'" означает, что если текущий модуль был запущен как главный (python program.py, а не import program), то в результате выполнятся инструкции находящиеся в этом блоке (в данном случае функция main()). Постепенно наращивая код, выделяйте новые функции, чаще всего это список операций, которые могут вызываться несколько раз, или упрощают понимание кода. Если несколько функций работают в блоке, объедините их в модуль (отдельный файл py) и импортируйте модуль в основной файл с программой (import <название модуля>). К хорошему тону относится использование и создание классов, по сути это модуль, который имеет более выраженный интерфейс. Под интерфейсом, в данном случае, я имею ввиду набор функций для работы над небольшими структурами данных(хотя это не совсем так). Старайтесь делать именно интерфейсы, а не конкретные реализации программ - для этого используйте аргументы функций, а не конкретные значения.​
Выглядит эта конструкция так:​
Python:
class ClassName:
    # Вне функций объявляются константы
    def __init__(self):
    # В функции инициализации объявляются переменные класса
        pass
    # функции для работы с классом
    def function(arg1, arg2):
        pass

Валидация данных
Всегда будьте уверены, что обрабатываемые данные именно такие, формат которых вы ожидаете получить - тип, диапазон значений и т.д. В случае, если данные могут не подходить и это вызовет прерывание(вылет) программы, то используйте конструкцию:​
Python:
Try:
    function()
except Exception as e:
    print(e)
    raise Exception(e)
Тем самым, вместо прерывания будут выполнены инструкции описанные в блоке except, при этом инструкции из блока try не будут выполнены.​
Рефакторинг
Периодически проводите вышеперечисленные операции для улучшения кода, для выявления и исправления ошибок (а они есть​
практически всегда). Находите более успешные реализации элементов программы, не бойтесь экспериментировать (при этом​
пользуйтесь VCS для перестраховки).​

Пример неплохого кода (калькулятор):
Код:
# импорт необходимых модулей и функций
import sys
from calc_engines import calc_from_config, calc_from_args

# Функция исполняющая основной механизм
# определяет входные параметры и выполняет вызов соответствующей функции расчета
def engine():
    # Словарь, определяющий соответствие между количеством
    # аргументов и функциями
    calc_mode_set = {2: calc_from_config, 4: calc_from_args}
    # Получаем аргументы
    args = sys.argv
    if len(args) in calc_mode_set:
        # Если устраивает количество аргументов, то вызываем нужную функцию
        print(calc_mode_set[len(args)](*args[1:]))
    else:
        # Иначе бросаем исключение
        raise SyntaxError("Неправильное количество данных")


# Точка входа в программу
if __name__ == '__main__':
    try:
        # Пробуем выполнить функцию,
        engine()
    except Exception as e:
        # если не получается, то выводим на экран ошибку
        print(e)

Код:
import json
# импорт класса
from calculate import Calculate

# функция-мост к результату классу
def calc_from_args(a, op, b):
    calc = Calculate(a, b, op)
    return calc.result

# функция по получению данных из файла, # подсчету и сохранению результата
def calc_from_config(filename):
    try:
        with open(filename, 'r') as file:
            config = json.load(file)
    except FileNotFoundError:
        raise FileNotFoundError("Файл не найден")

    calc = Calculate(config['a'], config['b'], config['op'])

    try:
        with open(config['filename'], 'w') as out_file:
            out_file.write(str(calc.result))
    except:
        raise FileExistsError("Не удалось сохранить результат")
    return calc.result

Код:
class Calculate:
    # список доступных операций
    operations = ['+', '-', '*', '/']
    # объявление переменных и вызов функций проверки данных
    # и присваивания результата
    def __init__(self, a, b, op):
        self.a = a
        self.b = b
        self.op = op
        self.validate_data()
        self.result = self.calc()

    # проверка данных на валидность - операция и числа
    def validate_data(self):
        if self.op in Calculate.operations:
            try:
                self.a, self.b = float(self.a), float(self.b)
            except ValueError:
                raise TypeError("Не число")
        else:
            raise KeyError("Неизвестная операция")

    # расчет результата
    def calc(self):
        result_set = {'+': self.a + self.b, '-': self.a - self.b,
                      '*': self.a * self.b, '/': self.a / self.b}
        return result_set[self.op]
Теперь при необходимости изменения программы, изменить нужный кусок кода будет проще, так как код держится обособленно.
Результат работы:
calculate_result.png

Питон - это хорошо, он работает на многих платформах, но для этого необходимы библиотеки и интерпретатор, а на целевой системе они есть не всегда. Обойти эти ограничения можно скомпилировав скрипт py в формат exe. Во время компиляции библиотеки и интерпретатор собираются в одном месте (файл или папка), которые и используются для запуска приложения. Сделать это можно несколькими способами - с помощью следующих библиотек:
py2exe
https://pypi.org/project/py2exe/
Самый старый способ и ныне не работает (на современных версиях python). Последний релиз был в конце 2014 года, и по легендам последняя версия, которую поддерживал была 3.4. Есть разные наработки с этой библиотекой на просторах интернета, но это уже ковыряние трупа, поэтому этим методом пользоваться не будем.

Cx_Freeze
https://pypi.org/project/cx_Freeze/
Неплохой способ получения исполняемого файла, однако он будет лежать в папке с библиотеками(в один файл не упаковать). Но из этого можно извлечь пользу - скопировав полученную папку на голую систему и удалив ненужные модули, общий размер уменьшится. Дальше c помощью архиватора упаковываем все файлы в exe. С установкой у меня возникли трудности, потому что из коробки ставиться не стал.
Тернистый путь установки:
Выполняя команду pip install cx_freeze командная строка сообщила, что нет VC++14
cx_freeze_error.png
Скачав:
https://visualstudio.microsoft.com/ru/downloads/
cx_freeze_build_tools.png
и установив: cx_freeze_build_tools_install.png
командой pip install cx_freeze получил ошибку "не найден файл cl.exe", в итоге полез на сайт pypi и обнаружил, что последние колеса подходят только к python 3.6, но поискав получше, нашел-таки для 3.7:
https://www.lfd.uci.edu/~gohlke/pythonlibs/#cx_freeze
cx_freeze_wheel.png
Скачав версию для amd64, pip отказался мне его ставить, мол не та платформа, а win32 поставился без проблем. Скачиваем нужную версию, устанавливаем с помощью команды
pip install <путь к файлу cx_Freeze-5.1.1-cp37-cp37m-*.whl>, например
pip install cx_Freeze-5.1.1-cp37-cp37m-win32.whl

Как пользоваться(на примере калькулятора):
Добавляем в проект файл setup.py с таким содержанием:
Код:
from cx_Freeze import setup, Executable

  setup(
    name="calculate",
    version="0.1",
    description="Calculator",
    executables=[Executable("run.py")]
    )


Получить exe командой:
python setup.py build
В папке build\exe.win32-3.7\ будут лежать файлы, среди которых вы найдете run.exe (переносить на другой PC всю папку)

PyInstaller
https://pypi.org/project/PyInstaller/
Очень популярный способ, самое свежее обновление, есть возможность собирать все в один файл.
Установка:
pip install pyinstaller

Компиляция в exe:
pyinstaller run.py
Файл exe будет ждать вас в папке dist.
Да, вот так просто. Также существует несколько полезных флагов:
  • python -OO -m PyInstaller run.py - применить базовые оптимизации
  • -c, --console, --nowindowed - при запуске программы появляется консольное окно
  • -w, --windowed, --noconsole - консоль не открывается
  • -i, --icon - указать иконку
  • -n, --name - указать имя
  • -D, --onedir - компиляция в одну директорию
  • -F, --onefile - компиляция в один файл
  • --log-level - уровень логгирования для установки
  • -y, --noconfirm - не спрашивать подтверждение во время установки
Рекомендую создать bat файл с вашими флагами, например:

Код:
python -OO -m PyInstaller --noconfirm --log-level=WARN ^
    --onefile --noconsole ^
    --icon=icon.ico --name=calculate ^
    run.py
Теперь для компиляции одиночного файла с иконкой без вывода консоли на экран просто запустите этот bat-файл (не забывайте, что виртуальное окружение должно быть активировано - для удобства используйте терминал PyCharm).
exe_result.png
Послесловие
На этом все, вводную информацию, которой хотел поделиться, я вам дал. Эта статья не является ни уроком, ни обучением по описанным программам и модулям, а представляет собой обзор через призму моего опыта на некоторые полезные вещи. Рекомендую пройти обучения по git, а также изучать полезные инструменты для python(библиотеки, механизмы,
best practices и т.д.). Еще раз скажу, что это вводная статья из цикла статей по злокодингу на python, и в ней та информация, на которую, возможно, буду ссылаться в будущем для разъяснения базовых вещей.
 

Вложения

  • git_3.png
    git_3.png
    6,9 KB · Просмотры: 2.261
Последнее редактирование:

Adam Good

Новичок
Сообщения
1
Реакции
0
0 руб.
sudo -i
apt-get install python
snap install pycharm-community
apt-get install atom

кроме питона ничего из этого нет в репозиториях линукс

А так спасибо огромное. Продолжай. Тема очень интересна. Буд читать дальше.
 

gh0st4ge

Местный
Сообщения
40
Реакции
86
0 руб.

AlkaSeltzer

Канадский программист

AlkaSeltzer

Канадский программист
Резидент
Сообщения
271
Реакции
409
0 руб.
Telegram
Уважаемый, это шедевр. Так-то я сам в программировании немного разбираюсь, но меня особенно приятно удивило количество подробностей и тонкостей в данной статье, а также отсутствие воды. В наше время это редкость... Благодарю, с удовольствием прочёл. Узнал много нового)
 

gh0st4ge

Местный
Сообщения
40
Реакции
86
0 руб.
кто подскажет в чем может быть причина?!
Введя в консоли/терминале python, вы запускаете интерпретатор. Строчка print('VLMI') это строчка кода для примера. если вручную введете ее, то результат будет как на картинке из первой части.
Для удобной работы ваших программ создавайте файлы с расширением ".py" и запускайте их через дополнительный аргумент.
Например, создайте файл:
Код:
print('VLMI')
Запуск кода:
python example.py

Также для новичков рекомендую использовать IDE, например PyCharm, и запускать код в ней (ctrl+shift+F10)
 
Введя в консоли/терминале python, вы запускаете интерпретатор. Строчка print('VLMI') это строчка кода для примера. если вручную введете ее, то результат будет как на картинке из первой части.
Для удобной работы ваших программ создавайте файлы с расширением ".py" и запускайте их через дополнительный аргумент.
Например, создайте файл:
Код:
print('VLMI')
Запуск кода:
python example.py

Также для новичков рекомендую использовать IDE, например PyCharm, и запускать код в ней (ctrl+shift+F10)
спасибо!
 

ZeroByte

Senior Developer

ZeroByte

Senior Developer
Местный
Сообщения
82
Реакции
325
0 руб.
Please note, if you want to make a deal with this user, that it is blocked.
Спасибо, полезная статья!
 
Сверху Снизу