Ответы пользователя по тегу Python
  • Зависает GUI при выполнении цикла в отдельном потоке. Как исправить?

    sheknitrtch
    @sheknitrtch
    У интерпретатора Python есть одна особенность: GIL. В интернете вы найдёте очень много статей о том, что это такое, и как GIL помогает/мешает писать многопоточные приложения.
    В случае использования QTimer, переменная timer локальная. Значит, после завершения метода run(self) эта переменная будет уничтожена и таймер никогда не сработает. Попробуйте написать:
    def run(self):
        timer = QtCore.QTimer()
        timer.timeout.connect(self.conf)
        timer.start(1000)
        self.timer = timer
    Ответ написан
    1 комментарий
  • Что это за непонятная строчка в grab при работе с DOM-деревом?

    sheknitrtch
    @sheknitrtch
    Когда вы выполняете код
    g.go('http://yandex.ru')
    происходит следующее: функция "go" возвращает объект экземпляр класса Response из модуля grab.response. При этом интерпретатор пытается вывести этот объект на экран. Стандартный способ вывода объекта - это преобразовать его в строку:
    <полное.имя.Класса object at адрес_объекта_в_памяти>

    За преобразование объекта в строку отвечают два метода: __repr__ и __str__.

    Ваш код можно переписать следующим образом:
    >>> resp = g.go('http://yandex.ru')
    >>> print resp
    <grab.response.Response object at 0x11bea90>
    >>> print resp.__repr__() #не самый лучший способ
    <grab.response.Response object at 0x11bea90>
    >>> print repr(resp) #вот так получше
    <grab.response.Response object at 0x11bea90>

    команда "print" автоматически вызывает метод __repr__ для объекта resp.

    Ещё пример:
    >>> import re
    >>> re.compile('aaa')
    <_sre.SRE_Pattern object at 0x01295EE8>

    Если вам не нравится, что на экран выводится имя класса и адрес объекта в памяти, то можете в классе Response переопределить метод "__repr__", чтобы он возвращал строку на ваш вкус.
    Ответ написан
    Комментировать
  • Как расшифровать строку с помощью PyCrypto?

    sheknitrtch
    @sheknitrtch
    Проблема в том, что вы неправильно используете библиотеку для AES дешифрации. В сообщении об ошибки чётко написано, что в переменной iv должно быть ровно 16 байт. Код дешифрации должен выглядеть следующим образом:
    key = 'some secret key'
    iv = '0123456789012345' #Вектор инициализации.
                 #Его длина должна быть 16 байт ровно
    ciphertext = '\xe7^t\xd1\xad\xf7o\x8fw\xf3V\xbby\xa7\x1ei\xce8\xe3}\x1b\xeb\xb7\x9e\x7f\xce^\xe7\xdd\xfd'
    aes = AES.new(key, AES.MODE_CBC, iv)
    text = aes.decrypt(ciphertext)

    key - это секретный ключ
    iv - это вектор инициализации. Где его брать в вашем случае - не знаю. Это не обязательный параметр. Как написано в документации, можно его не передавать в метод new.
    ciphertext - это зашифрованный текст.
    Ответ написан
    Комментировать
  • С чем сравнить число в python, чтобы в результате всегда было true/false?

    sheknitrtch
    @sheknitrtch
    Насколько Я знаю в Python 2.x константа None всегда меньше любого числа
    print None < 1024  #True
    print None < 0     #True
    print None < -1024 #True

    Но в Python 3.x такое сравнение недопустимо, и возникнет Exception.
    См. также вопрос на Stackoverflow
    Ответ написан
  • Как вызвать объект из другого объекта?

    sheknitrtch
    @sheknitrtch
    Видимо вы только недавно начали изучать программирование. Во первых стоит перевести на русский язык сообщение об ошибке и попробовать понять, что именно не нравится интерпретатору. Во вторых, используйте Google прежде чем задавать вопросы. И в третьих, не стоит вставлять кусок программы и ожидать, что кто-то будет читать ваш код и пытаться в нём разобраться.

    Ваша ошибка состоит в том, что вы пытаетесь вызвать метод insert для класса "WorkArea". Но этого класса нет такого метода. У него есть только метод __init__. Видимо должен быть вызван метод insert у класса tkinter.Text ?
    Я исправил класс WorkArea из вашего примера:
    https://gist.github.com/anonymous/8851536
    Проверить не могу, так как у меня не установлен tkinter.
    Замечания:
    1. Использование глобальной булевой переменной workArea - плохая практика
    2. Имя переменной workArea почти совпадает с именем класса WorkArea - плохая практика, их легко перепутать и получить много весёлых сообщений об ошибках
    3. Выражение self.new = ... заменяет метод "new" на объект. Не стоит называть метод и поле одним именем.
    4. Непонятно, зачем класс ToolBar наследует два других класса. Мне кажется, что можно объеденить классы "Operations" и "TooBar" в один, который наследовал бы tkinter.Frame.
    Ответ написан
    1 комментарий
  • Как обработать дамп википедии Wikipedia Extractor-ом?

    sheknitrtch
    @sheknitrtch
    Wikipedia extractor - это Python скрипт, который на входе получает XML дампа базы данных Wikipedia, а на выходе - текст. То есть должен быть установлен Python. Чтобы скормить этому скрипту базу данных, её нужно предварительно извлечь из BZ2 архива. Но распакованный файл будет занимать очень много места. Поэтому разработчики рекомендуют делать распаковку на лету, не сохраняя данные на винчестере. В Linux для этого есть утилита bzip2. Под Windows можно использовать консольный 7-zip. Команда будет следующая
    7z.exe  e -so DUMP.bz2 | python WikiExtractor.py -cb 250K -o extracted

    Всё, что идёт до символа '|' - это команда распаковки. А после - это команда запуска Wikipedia Extractor-а с какими-то параметрами.
    Я не проверял, работает ли такой способ, так как у меня нет дампа Wiki.
    Ответ написан
    1 комментарий