Ответы пользователя по тегу Python
  • Python теряется эвент нажатия клавиши, как только нажата другая, как избежать?

    @nirvimel
    Можно использовать GetAsyncKeyState, например.
    О причинах подобного поведения и о различиях между GetAsyncKeyState и GetKeyState подробнее тут.
    Ответ написан
    3 комментария
  • Как задать ширину DataFrame в консоле Ipython?

    @nirvimel
    Я так понял, вы используете pandas (в тегах не указано). Тогда попробуйте это:
    import pandas
    pandas.set_option('display.max_columns', 50)
    pandas.set_option('display.width', 1000)

    Тут подробнее.
    Ответ написан
    1 комментарий
  • На базе чего создавать таск менеджер с применением Python?

    @nirvimel
    Начать с изучения хороших примеров на Django и на Flask.
    Ответ написан
    Комментировать
  • Как перевести кириллицу в ASCII?

    @nirvimel
    Ваша загадочная кодировка называется cp1251.
    'ной'.encode('cp1251') == b'\xed\xee\xe9'
    Но учитывайте, что этот пережиток прошлого не соответствует стандарту unicode. На современных ОС с такой кодировкой могут быть проблемы. Для современных переносимых решений лучше использовать utf8, как сказал pygame.
    Ответ написан
    2 комментария
  • Как выполнить xor строки?

    @nirvimel
    Боюсь что универсального решения для любых типов данных достичь не получится хотя бы потому что внутреннее представление различных типов зависит от интерпретатора и платформы, и в общем случае непостоянно.
    Но для str и int могу предложить такое решение:
    def xor_bytes(data):
        accumulator = 0
        for item in data:
            if isinstance(item, int):
                string = to_bytes(item)
            elif isinstance(item, str):
                string = item
            else:
                raise Exception('Invalid item type')
            for char in string:
                accumulator ^= (ord(char) & 0xff)
        return accumulator

    И вспомогательная функция для python2, в котором int.to_bytes() не существует:
    def to_bytes(n, length=8, endianess='big'):
        h = '%x' % n
        s = ('0'*(len(h) % 2) + h).zfill(length*2).decode('hex')
        return s if endianess == 'big' else s[::-1]
    Ответ написан
    Комментировать
  • Как лучше организовать электронную библиотеку?

    @nirvimel
    >500000

    Можете использовать ext4 или почти любую современную файловую систему.

    Главное предупреждение: Даже не пытайтесь сложить все это в одни каталог! Последствия могут оказаться печальными. Вплоть до того, что вы даже не сможете удалить из мега-каталога что-то без полного форматирования ФС. Сходу не найду ссылки, но были прецеденты печальных историй.

    Лучше разбить коллекцию на 1000 каталогов по 1000 файлов.
    Ответ написан
    Комментировать
  • Python, ошибка socket error processing request?

    @nirvimel
    Система логгирования ошибок в django у вас настроена на отправку сообщений по почте. А smtp почтовый сервер, видимо, задан неверно.
    При обработке запроса где-то в ядре django происходит ошибка. Текст этой ошибки мог бы нам о чем-то сказать. Но при попытке логгировать это сообщение, происходит попытка отправить его по почте и попытка соединиться с почтовым сервером (который или не существует или не является почтовым сервером) в ожидании коннекта вылетает по таймауту Connection timed out.

    Проверьте конфигурацию django, там случайно нигде не остались адреса типа example.com?
    Ответ написан
    1 комментарий
  • Как загрузить DDS файл в Python 3?

    @nirvimel
    Мне тут совсем недавно angru подкинул для изучения некий pyglet в ходе обсуждения моего вопроса. В процессе медленного поглощения документации, среди прочего не особо интересного мне функционала, мелькнул такой модуль pyglet.image.codecs.dds с классом DDSImageDecoder.
    За 30 сек. на коленке я написал такой код (будет чудо, если сработает):
    from pyglet.image.codecs.dds import DDSImageDecoder.
    from pyglet.image import load
    image = load('one_file.dds', decoder=DDSImageDecoder())
    image.save('another_file.png')
    Ответ написан
    1 комментарий
  • Как в одной строке обозначить три переменные?

    @nirvimel
    s = raw_input('Enter 3 words')
    word1, word2, word3 = (s.split() + [''] * 3)[:3]
    print  word3, word2, word1
    Ответ написан
  • Реализовать простую web-программу отображения "матрицы" чисел -- какой способ выбрать?

    @nirvimel
    Для того, чтобы со стороны сервера передать какой-то сигнал в уже открытую в браузере страницу существует одна технология - WebSocket (не считая Push, которым пытались решить эту проблему во времена до появления WebSocket).
    На стороне сервера существует разные решения на Pyhon: (1) под Flask + Gevent (2) под Flask + uWSGI (3) ws4py и другие.
    Есть удобная библиотека Socket.IO, это клиент и сервер на javascript, у нее собственный высокоуровневый протокол поверх WebSocket (+ поддержка старых браузеров без WebSocket). Сервер соответственно под node.js (не совсем подходит под ваши требования). Но есть сторонние реализации сервера на Python под Flask и без Flask.
    PHP для WebSocket - не лучшее решение и причина в этом.
    Ответ написан
    Комментировать
  • Где ошибка при request python (получаю status code = 400)?

    @nirvimel
    Все дело в User-Agent Попробуйте так:
    headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}
    response = requests.get(url, headers=headers)

    Еще есть такая штука. Ставится так:
    pip install fake-useragent
    Работать должна так:
    from fake_useragent import UserAgent
    ua = UserAgent()
    headers = {'User-Agent': ua.random}
    response = requests.get(url, headers=headers)
    Ответ написан
    Комментировать
  • Как получить доступ к Ajax контенту во время парсинга?

    @nirvimel
    В общем случае, при помощи парсинга html, не возможно получить страницу в том виде в который ее приводят ее собственные джаваскрипты при загрузке потому, что парсер - не браузер, он не исполняет джаваскрипты.
    В частных случаях можно вынуть из текста скрипта все urlы по которым идут ajax запросы, производить все эти запросы в своем коде и парсить результаты. Тут куча подводных камней - во-первых, параметры ajax запроса могут быть спрятаны в коде каким-нибудь не тривиальным образом, во-вторых нужно правильно выставить все заголовки запроса со всеми куками (которыми скрипты со страницы так же могут манипулировать), потом не забыть правильно задать referrer. В общем случае у скриптов на странице всегда остается возможность, используя какие-нибудь динамически меняющиеся параметры, запутать свою работу так, что для такой страницы создать парсер будет невозможно.
    Радикально иной вариант - использовать настоящий браузер (через Sillentium, например), который исполняет все скрипты и, с точки зрения противоположной стороны, неотличим от живого пользователя. Это решает все проблемы с хитрыми ajax-ами. Но это уже совсем другой порядок объемов потребляемых ресурсов и скорости. Если, например, на самом дешевом vps (с 128 Мб памяти) на гигабитном канале можно парсить в 50-100 потоков. Даже из расчета по несколько секунд на ожидание + обработку каждой страницы получаем 10-20 расперсенных страниц в секнду. Теперь если перейти на Sillentium + Webkit, то 128 Мб уже не хватает для запуска даже одного потока. Если даже запускать все это на своем домашнем десктопе с гигабайтами памяти (с vps в качестве прокси), то можно получить максимум несколько расперсенных страниц в секунду. То есть парсинг через полноценный браузер не конкурент парсерам типа lxml + requests/liburl.
    Ответ написан
    Комментировать
  • Почему создаются дополнительные потоки в конце очереди?

    @nirvimel
    С виду тут все в полном порядке.
    Имеем 50 ПАРАЛЛЕЛЬНЫХ потоков, которые питаются из очереди в 500 элементов.
    1. К моменту когда первый поток окончил выполнение своего задания, на выполнение которого потратил некоторое время, в очереди давно уже осталось 450 элементов, ведь расхватывают новые задания потоки мгновенно и ПАРАЛЛЕЛЬНО.
    2. К моменту, когда завершилось выполнение 450-го задания, оставшиеся 50 уже находятся в работе, их уже расхватали потоки, и в очереди осталось 0 элементов. После чего оставшиеся 49 потоков заканчивают выполнение своих заданий и каждый рапортует о том, что наблюдает в очереди ноль элементов, после чего воркеры вылетают по task_done() и подбираются join-ом в основном потоке.
    Ответ написан
    2 комментария
  • Как рисовать гистограммы в GTK3-виджет + PyGObject?

    @nirvimel
    В вашем случае, наверное, только вручную рисовать простыми примитивами (прямоугольниками, линиями) на DrawingArea при помощи DrawingMethods (это под gtk2, но под 3-ий будет аналогично). Маловероятно, что где-то найдется СПЕЦИАЛЬНАЯ библиотека для рисования ИМЕННО гистограмм ИМЕННО под GTK3, притом достаточно легковесная для вас.
    Если не существует ТЕХНИЧЕСКИХ ограничений, мешающих пользоваться matplotlib, то вероятно вы придете к тому, чтобы ей воспользоваться. Весь софт на python под GTK, способный рисовать гистограммы так или иначе стоит на matplotlib. Реальных альтернатив, похоже, не существует.
    Ответ написан
    1 комментарий
  • Как протестить удаление с помощь Selenium?

    @nirvimel
    Дело в том, что метод click создает событие click, которое имеет свойства screenX и screenY, то есть должно происходить на "видимом" экране. Работа через Selenium не меняет того факта, что браузер и все скрипты на странице работают с неким "видимым" экраном. Иначе одной строкой на js можно было бы легко выявить весь обман и отсутствие живого человека по ту сторону браузера.
    Но find_elements_by_xpath возвращает все соответствующие данному xpath элементы дерева в независимости от их реальной видимости. При этом невозможно вызвать click на элементе за пределами "видимого" экрана.
    Частично решить эту проблему можно путем вызова scrollIntoView на элементе перед click. Но у этого метода тоже могут возникать проблемы с элементами, у которых (или у их родителей) style="display:none".
    Ответ написан
    Комментировать