Ответы пользователя по тегу Python
  • Что делать дальше?

    На Тостере много раз задавался этот вопрос с разными формулировками. Сначала стоит прочитать
    лучшие ответы на эти вопросы. Никому, из умелых и ценящих свое время, не хочется повторяться.
    Я неоднократно писал про начало на этом сайте.

    и единственное, что понял, что нужно обязательное знание ООП

    В Python нет "продвинутой" ООП, и изучение ООП в случае Python не должно занять много
    времени (по сравнению с Java и тем более C++). Более или менее больших организациях,
    элементы ООП используются, чтобы упорядочить большой код (классы) и еще в силу привычки.
    Мир потихоньку уходит от ООП, в маленьких проектах просто в процедурное
    программирование и в функциональное программирование. Поставьте себе в очередь,
    после изучения ООП, функциональное программирование.
    Ответ написан
    Комментировать
  • Можно ли как то запускать python скрипт каждые 30 минут не используя cron?

    Нужно перемешивать посты модели django каждые 30 минут. Возможно ли это сделать без использования крона?

    Для лучшей практики, не нужно ничего перемешавать. Связано с тем, что, не нужно путать представление данных и сами данные. Данные не должны меняться, лишь представляться посетителю в разных последовательностях. В MVC, мы не меняем модель, для изменения представления у нас есть View.
    Я не пишу на Django, но воспользовался поиском и вот одно из решении
    Ответ написан
    Комментировать
  • Где научиться алгоритмам?

    Почитай книгу «Грокаем алгоритмы. Иллюстрированное пособие для
    программистов и любопытствующих». В нем примеры приводятся на
    Python и объясняются приведенные Вами термины.

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

    Касательно Python, если не приходилось изучать/писать программы с
    использованием стандартной библиотеки collections, то советую
    посмотреть внимательно. Есть реализация множества алгоритмов,
    которые необходимы в жизни при работе. Избавит Вас от повторного
    написания этих алгоритмов.
    Ответ написан
    Комментировать
  • Как поставить python 3.4 на флешку?

    Предложу Вам использовать pyenv. Сам как раз для подобных случаев использую.
    Позволяет установить различные версии Python и при необходимости переключаться
    между ними. Использую для тестирования в своих пакетов в различных версиях Python

    Если у Вас windows, то придется использовать портированный на него pyenv-win
    Сам этот порт не использовал, т.к. использую MacOS.

    Использование:
    pyenv install --list  <---- Список доступных для установки версии
    pyenv install 3.4.6  <--- Установка Python 3.4.6
    pyenv versions  <--- Список доступных для переключения версии
    pyenv local 3.4.6  <---- Переключение на Python 3.4.6
    python -V  <---  Проверка текущей версии
    pyenv local system <--- Переключение обратно на Python установленый в ОС
    python -V  <---  Проверка текущей версии
    Ответ написан
    Комментировать
  • Обязательно ли использовать try/else?

    Ваши варианты не ошибочны, но есть несколько моментов для осмысления.
    Судя по наличию return, у Вас функция возвращает текст. Какое поведение Вы предусмотрели
    в случае неудачного завершения операции requests.get? И на каком уровне Вы намерены
    обрабатывать ошибки. Никто не может сказать Вам, как правильно, пока не узнает контекст
    Вашей задачи. Может Вы выберите стратегию: "падать как можно раньше" и вызвав панику
    завершите приложение, запишите в лог и перейдете к следующему url или что то еще.

    Предложу Вам третьи вариант:
    try:
        html = requests.get(url, headers=self.headers)
    except Exception as e:
        print('Root page parse is failed', e)
        # Ваши инструкции для ошибочной ситуации
    return html.text

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

    P.S. Если будет время, то виды исключении лучше обрабатывать явно, а не
    ловить их все в один блок. Так можно прописать несколько стратегии для
    разных случаев сбоя.
    Ответ написан
    5 комментариев
  • Какую библиотеку Python использовать для управления приложениями?

    frendri, используй pywinauto или более высокоуровневый pyautogui

    Вот статья с Хабра на русском.
    Будут сложности, пиши в комментарии, отвечу. Прежде чем задавать вопросы, прочтие статьи
    в интернете и конечно официальный сайт библиотеки, попробуйте написать что нибудь.
    Если будете использовать pywinauto, то неизбежно придется по минимуму изучить
    устройство Windows программ. pyautogui должен быть менее требователен по квалификации,
    но так скажем "более толстая" библиотека.

    P.S. Со своего опыта могу сказать: нужно было автоматизировать нажатие в программе написаной
    на FoxPro для создания отчетов. Использовал pywinauto. Большинство действии без проблем сделал,
    но некоторые действия не давались из за того, что не мог узнать идентификаторы некоторых кнопок.
    Выкрутился отправляя нужное количество нажатии на TAB для переключения на нужную кнопку и
    SPACE для нажатие. Есть и более хипстерский способ, использовать распознавание по контрольной
    картинке элемента окна (pyautogui), но его не приходилось использовать
    Ответ написан
    3 комментария
  • Почему получение данных в python socket останавливается?

    Drovosek01, то как Вы написали веб сервер не годится для реальных задач. Вам легче и лучше было бы переписать сервер используя библиотеку или фреймворк (bottle, falcon, flask, ...). Но если целью стоит изучение работы сокетов, то:
    1. Ваш сервер однопоточен и блокируемый. Причина может крыться в этом, т.к. браузер вполне может соединяться с веб сервером параллельно в несколько потоков. Посмотрите примеры неблокируемого режима сокет сервера и/или используйте нити (threads). Если будет сложно, как я и писал переходите на высокоуровневое программирование.
    2. Причина остановки может быть пассивное закрытие сокета из за TTL к примеру. Проверяйте работы сокетов не на высоком уровне(Chrome), а на низком используя WireShark. Т.к. у Вас не отлаженный низкоуровневый код.
    3. И по поводу возможного TTL, способ которым Вы создаете страницу, уж простите, ужасный. Хотя бы перепишите возврат шаблонов в таком виде:
      def index():
          with open(os.path.join(dir,'templates/index.html'), encoding='utf-8') as template:
              buffer = template.read()
          while True:
             yield buffer
      Чтение с диска на кажде соединение, даже если у Вас SSD, это как то черезчур там более в таком простом случае
    Ответ написан
    1 комментарий
  • Не записывает в файл?

    Артем Марш, в коде полно ошибок:
    1. После первой строки не нужен отступ(4 пробела перед for ...)
    2. Не понятно, какая необходимость извлекать сведения из словаря в переменные? (name = item['first_name'], ...)
    3. Дуплицирование кода
      print('|', name, lname, '|', 'id' + str(iduser), '|', 'Пол:', sex, '|', '==>', online)
      . Во всех случаях одно и то же, и поэтому печать на экран можно вывести из блока if sex == 1
    4. Запись в файл лучше оформить через контекст, т.е. через with
    5. И самое главное!
      Сам файл создался, но записей в нем нету.
      . Файл Вы открываете на запись, а не на добавление. Получается при каждом проходе цикла файл перезаписывается без сохранения предыдущих результатов. Режим для добавления строк в файл:f = open('result.txt', mode='a')
    6. Проверка связанная с полом, несколько переусложнена. Лучше подобные проверки выводить в функции для чистоты кода. Не буду писать подробнее, т.к. потребует еще большего времени для объяснения


    По поводу вопроса в комментарии к ответу Сергей Горностаев:
    1. Какой смысл в преобразовании str в bytes при записи?(.encode('utf-8')) Чтобы при чтении преобразовать обратно в строку Unicode?! По мне, так логичнее так и хранить в Unicode. При открытии файла на запись указать кодировку:
      with open('result.txt', encoding='utf-8') as f:
          ...

    2. Ошибка TypeError: sequence item 3: expected str instance, int found выводится, т.к. аргументами метода join должны быть коллекция из строк(str). А переменная iduser типа int(целое число). Нужно преобразовать перед передачей в join: '\t'.join([ name, lname, online, str(iduser)])

    Вот код для записи:
    with open('result.txt', encoding='utf-8', mode='a') as f:
        f.write('\t'.join([ name, lname, online, str(iduser)]))

    или
    f = open('result.txt', encoding='utf-8', mode='w')
    for item in group['items']:
        ...
            f.write('\t'.join([ name, lname, online, str(iduser)]))
        ...
    f.close()


    P.S. И маленький совет не связанный с ошибками. Формат в котором Вы записываете в файл напоминает CSV. Поменяйте:
    1. расширение файла на csv
    2. разделитель вместо таба(/t) используйте точку с запятой (;)
    3. и первыми строчками можете добавить заголовки для полей (расшифровка полей)

    И можете смотреть в файл в табличных редакторах(Excel, ...), подвергать в них анализу, сортировке, ...
    Ответ написан
    3 комментария
  • Как стать разработчиком Python?

    Здравствуйте david240,
    Хороший у Вас вопрос. Разработчик - это кто программирует на производстве. Если хотите короткий ответ: устройтесь на работу разработчиком. В индустрии начальный уровень сотрудников называют Junior (джуниер, некоторые сокращают до джунов). И конечно, это самый действенный совет, т.к. есть множество вещей которые не освящают книги, курсы, ... Компании занятые производством программного обеспечения сами заинтересованы в квалифицированных специалистах, и помогут подтянуть Ваши навыки при желании и усердии с Вашей стороны.
    Ситуации бывают разные и желания. Если Вы хотите стать независимым разработчиком или сначала хотите повысить свои шансы на трудоустройство в крупную компанию, то:
    1. Заведите в учетную запись в одном из сервисов предоставляющих хранение репозитории (github, gitlab, bitbucket, ...). Освойте git, и выложите свои лучшие учебные, рабочие и иные проекты на этих сервисах. Цель: Ваши работы в этих сервисах скажут о Вас лучше любых резюме. А отсутствие учетной записи в подобных сервисах подействует на Вашу потенциальную репутацию хуже, чем не очень удачные работы или начальный уровень Ваших работ. В нашей индустрии уже давно это стало нормой. Как говорит Линус Торвальдс: Talk is cheap, show me the code!
    2. Разумеется Вы будете волноваться о невысоком уровне Ваших начальных работ в Вашем репозитории. Постепенно улучшайте свои работы, выкладывая обновления. Хороший специалист все равно выявит Ваш уровень с вероятностью 100% при собеседовании. Следите, чтобы Ваши работы в репозитории отражал Ваш реальный уровень. Читайте книги, смотрите доклады с конференции (PyCon, Moscow PyCon, ...), проходите курсы(Udacity, Udemy, Code Academy, ...), ... С обретением новый знании и навыков, обновляйте свой код в репозитории
    3. Почитайте книгу "Чистый код" Роберта Мартина. Как его обычно называют, дядя Боб, практик к которому прислушиваются даже специалисты высокого уровня. Его книги и доклады дают качественный материал для становления специалистом в области разработки программного обеспечения.
    4. Уделяйте внимание не только техническому аспекту нашей специальности. Повышайте свою продуктивность через изучение гибких методологии (Agile), организацию своих дел (GTD, ...), повышайте своих коммуникативные способности, ... Разработчики в большинстве своем интроверты, но не то чтобы работодателям это нравилось. Нужно работать над собой в широком смысле этого слова.

    И напоследок скажу, не обязательно все что я написал освоить за короткий срок. Лучше ориентируйтесь и готовитесь к долгосрочной перспективе. И удачи в Ваших начинаниях!
    Ответ написан
    Комментировать
  • Redis, ZMQ, etc. Можно ли одновременно реализовать что-либо на подобие pub/sub и queue?

    Посмотрите внимательно на dramatiq. В качестве брокера в этом фреймворке можно использовать RabbitMQ, Redis или для легковесности брокер с хранением в памяти
    Ответ написан
    Комментировать
  • Какие книги по хакингу python 3 посоветуете?

    Не стоит отбрасывать книгу из за того, что она написана с примерами на Python 2.7. Самое ценное, что можно почерпнуть из подобных книг - это подход к взлому, а не синтаксис языка программирования.
    Начинайте изучение не со стороны программирования, а со стороны уже известных уязвимостей. Есть скучный на вид сайт OWASP, который является настоящим кладом для специалистов по компьютерной безопасности. Есть в интернете и переводы.

    Я не говорю, что программирование не нужно учить, учите по началу раздельно техники взлома и защиты(1) и программирование(2). Через какое то время, если хватит терпения, "пазл в голове" сложится. Книг на данную тематику не очень много, ведь не каждый специалист пишет книги. Ищите книги и материалы более широко, не обращая внимания на язык программирования. Уязвимости что подходят для низкоуровневых языков (assembler, C, C++, ...) практический все подойдут для всех остальных представителей и т.д. А так же знание об уязвимостях не помогут без хорошего базового знания программирования
    Ответ написан
    Комментировать
  • Можно ли использовать глобальные переменные в классе?

    Если a и b - это не изменяемые переменные (в Python нет констант), то допустимо. Без реального примера кода не возможно понять применение.

    В приведенном Вами примере никакого смысла нет. a и b в первом примере - это локалные переменные, т.е. можно сказать с коротким временем жизни. Без использования self не произойдет привязки к экземпляру класса (не станут атрибутами). Помимо атрибутов экземпляров, есть еще и атрибуты класса.
    Ответ написан
    Комментировать
  • Как нажать несколько кнопок одновременно на selenium python?

    Очевидно Вы ошиблись, одновременно нажать не получится, только последовательно.
    Вот пример, как нажать последовательно:
    from selenium import webdriver
    
    driver = webdriver.Edge()
    driver.get('https://www.avito.ru/moskva/nedvizhimost')
    all_buttons = driver.find_elements_by_xpath('//button[@class="recommendations-show-more js-recommendations-show-more"]')
    for button in all_buttons:
        button.click()

    По моему, имя класса для выборки можно сократить, главное чтобы выбирал уникальные кнопки. Библиотеку BeautifulSoup не нужно использовать, т.к. Selenium имеет средства для парсинга. Можно ознакомится в документации.

    FIXED: Была ошибка в строке поиска. Забыл закрыть ковычки и скобку ( "] )
    Ответ написан
    4 комментария
  • Pip3 ссылается на Python3 ранней версии, почему?

    Думаю очевидно, Python 3.4 не был обновлен в системе, а был установлен рядом. Такое случается, когда для данной ОС не было выпущено обновление Python. python3 был переопределен, а pip3 ссылается на системный Python.
    Есть несколько решении:
    • Начиная с Python 3.4 pip в виде модуля встроен в сам Python. И может вызываться к примеру так: python3 -m pip install request. Можете использовать, будет работать как надо
    • Иногда иметь разные версии Python полезно. К примеру тестировать свою программу с различными версиями CPython. Рекомендую pyenv для *nix систем. Переключает версию Python используемую в системе, позволяет для отдельного проекта закрепить версию Python, а так же удобно устанавливать различные версии
    • Добавить alias в системный профиль оболочки: alias pip3='/Путь/к pip3/от Python 3.4'. Это переопределит pip3 в системе и будет вызываться правильная версия.
    Ответ написан
    Комментировать
  • Что исправит в коде, что бы в ответе было не только число, но и текст?

    В Вашем коде немало ошибок:
    1. print('Ваш идеальный вес', 'x') выведет символ `x`, а не переменную x
    2. Строки print('Ваш идеальный вес') + 'x' и print('Ваш вес должен составлять') + x ошибочны. print является встроенный функцией для печати на экран, и аргументы должны передаваться внутри скобок. И конечно, переменная x должна писаться без кавычек
    3. Есть несколько не существенных ошибок по стилистике языка Python, которые не влияют на работу

    Вот, как бы я написал то же:
    print('Ваш идеальный вес по формуле Брока')
    while True:
        height = input('Ваш рост в сантиметрах: ')
        if height.isdecimal():
            height = int(height)
            break
        elif not height:
            return
        else:
            print('Введите рост в виде числа или нажмите Enter для выхода')
    if height <= 165:
        weight = height - 100
        print('Ваш идеальный вес {} кг'.format(weight))
    elif height <= 175:
        weight = height - 105
        print('Ваш идеальный вес {} кг'.format(weight))
    elif height >= 176:
        weight = height - 110
        print('Ваш вес должен составлять {} кг'.format(weight))
    Ответ написан
    Комментировать
  • Какие минусы и особенности есть у python kivy для Android/ios разработки?

    С уважаемым Fian не соглашусь.
    • В целом, разницы в производительности с React Native вовсе нет. Это не мое мнение, и не является секретом. В Хабре, Readit и т.д. неоднократно обсуждалось.
    • С мнением на счет лучшего функционала, так же необосновательны. Технологии на котором основывается работа Kivy и React Native одна и та же. Различие в способе запуска, это CPython и Javascript движок (V8 или что там). Количество готовых библиотек для Python, наверное, даже чуть больше чем для JS. И там и там можно напрямую обратиться к API операционной системы, в случае чего.
    • Для корпоративных приложении и production решении важна поддерживаемость решения. Между Kivy и JS фреймворками (React Native, NativeScript, ...), к сожалению, разница не так велика. И отстает от Native решении. У Kivy недостаток в наличих хороших примеров и документации, а у React Native плохая стабильность продукта (сам был свидетелем и не раз обсуждалось в интернете)
    • Хоть Kivy весьма не плоха, и хоть имею более 10 лет опыта с Python, но для себя решил использовать NativeScript+Vue. Решение хоть и молодое, но из за Vue фантастический удобная и за счет NativeScript постабильнее React Native
    • Слежу за развитием Kivy, и готов переидти на него после появления лучшего бинарного сборщика(не нравится buildozer) и развития UI фреймворков для него (KivyMD, ...)
    В чем плюсы и минусы kivy? Что должен знать перед началом изучения/разработки? Какие есть подводные камни, особенности?

    Все зависит от специфики Вашего приложения. Тема слишком обширная. Для создания строгого дизайна в виде форм используйте вместе с KivyMD. Для игр и приложении для обучения, где важна графика, Kivy и так очень хороша.
    Могут возникнуть трудности при сборке бинарных пакетов для мобильных ОС. Для Android есть buildozer, с которым люди испытывают проблемы. В Хабре есть статья про его настройку. А так же серия статьей про сам Kivy.
    Для процесса обучения одними советами не обойтись: читайте книги по данной тематике, зарегистрируйтесь и подпишитесь на нужные темы в dev.to/, не ограничивайтесь только программированием - изучайте сам процесс разработки (Agile, рефакторинг, тестирование, ...)
    Ответ написан
    Комментировать
  • По-быстрому слепить Android-приложение на Python (Kivy?). Стоит ли?

    Посоветовать действительно много чего:
    • Kivy довольно простой инструмент для создания мобильного приложения. Насколько я читал, проблема больше в сборке бинарных пакетов для мобильные ОС. Для Android есть buildozer, с которым люди испытывают проблемы. В Хабре есть статья про его настройку
    • Мобильное приложение для управления - не сложная задача. Логика очевидно будет на сервере, а клиент можно сделать и на современных Javascript фреймвоках. Не зацикливайтесь на языках и технологиях, самое важное в сроках и качестве исполнения.
    • Не тратьте много времени на мелочи. Кроме минимального мобильного клиента и сервера, Вам не мало времени придется провести за проработкой протокола обмена, способе и виде хранения, оптимизации и отладке всего этого и т.д. Быстро создайте прототип, путь и не самый красивый, а позже украшательство можно внести.
    • Из практических советов: В мобильном клиенте можете сильно "затормозится" на реализации хороших графиков. Можно значительно упростить, если воспользоваться готовыми html виджетами. Для python есть довольно популярный Dash. В мобильном клиенте можно показывать через html контейнер.
    • При работе с железом хорошо бы использовать очередь в том или ином виде. Советую очень хорошую реализацию очереди на Python: dramatiq. Для крупного проекта RabbitMQ или NATS
    • Для создания сервера на Python очень рекомендую molten. Проект хоть и молодой, но стабильный и очень продуманный и современный. P.S. есть интеграция с dramatiq с коробки.

    Самому приходилось писать на Python решение для умного дома, так что знаю о чем пишу.
    Ответ написан
    1 комментарий
  • Чем можно воспользоваться для создания text-based user interface в Python?

    Я для себя нашел picotui
    Все необходимое для создания приложении, вроде Norton Commander или Turbo Pascal, имеется. Удобная и с примерами.

    А как сделать символы из символов :
    Например мне хочется создать таймер и сделать вывод чисел как в termdown.

    Я так понимаю Вам нужно python-cfonts Совсем недавно нашел. И можно использовать с чем угодно. Сам собираюсь использовать с picotui
    Ответ написан
    Комментировать
  • PermissionError: [Errno 13] Permission denied. Что делать?

    Не сработало скорее всего из за того, что "\" это спец. символ. Используется для обозначения таких вещей как конец строки (\n), табуляция (\t). В Вашем случае, скорее всего пыталась понять что значит \д, \G и т.д. Для написания символа \ в строках используют \\.
    В зависимости от версии Python может быть проблема и в кодировке пути. Т.к. есть различие русских символов в UTF8 и cp1251 которая используется обычно в Windows.

    Я бы написал так:
    import os
    from shutil import copyfile, rmtree
    
    SOURCE = 'D:\\домашка\\G_ Arhangelskiy_-_Time_Draive\\G_ Arhangelskiy_-_Time_Draive'
    DESTINATION = 'D:\\домашка\\G_ Arhangelskiy_-_Time_Draive\\G_ Arhangelskiy_-_Time_Draive — копия'
    
    files = [f.path for f in os.scandir(SOURCE) if f.is_file()]
    for file in files:
        copyfile(file, DESTINATION)
    rmtree(SOURCE)


    Как опытный разработчик на Python могу дать совет:
    • Повторяющиеся значения выделить в отдельную переменную (лучше было бы в константу, но в Python нет констант). Это по поводу пути исходника, которую я выделил в SOURCE (есть такое соглашение, когда неизменяемые переменные пишут заглавными)
    • Для удаления пути рекурсивно, есть rmtree в модуле shutils, а так же os.scandir более удобен чем os.listdir
    • Установите линтер (flake8) и настройте свой редактор на использование его. По коду видно, что не используете линтер
    Ответ написан
    Комментировать
  • Почему скрипт, запущенный через systemd, зависает?

    Советую запускать сервисы на Python через Supervisord (по старинке) или Circus, и предусмотреть в коде частные случаи.

    Причина: В реальной жизни есть масса тонкостей, такие как наличие зависимых сервисов и порядок запуска, отсутствие доступа к сети, отсутствие прав к ФС, сети и т.д., ... Указанные продукты позволят настроить многие из указанных моментов, а так же как указал Pavel Denisov timeout для них и логирование.

    Если не хотите вводить еще одну зависимость в свой продукт, то в файле описания сервиса systemd, можно указать некоторые правила для запуска сервиса
    Ответ написан
    Комментировать