Профиль пользователя заблокирован сроком «навсегда» без указания причины
Ответы пользователя по тегу Python
  • Python mysql wrong architecture mac os 10.8.3?

    @MikhailEdoshin
    По traceback'у видно, что у вас mysql как-то установился в ~/Downloads и в скрытый ~/.python-eggs, и одновременно в более предсказуемый /Library/Python/2.7/site-packages/. Попробуйте убрать вот эти вот первые папки (может быть, временные).
    Ответ написан
    1 комментарий
  • Глобальный импорт модулей в Python

    @MikhailEdoshin
    from parent import _mysql. Можно также просто повторно импортировать _mysql, это вернет уже импортированный модуль из sys.modules. В Python у каждого модуля свое пространство имен, модули между собой никак не пересекаются, и это считается feature, а не bug. Импортировать _mysql даже правильнее, если родительский модуль ничего к нему не добавляет — это явно дает понять, что мы имеем дело с общим _mysql, а не с тем, что в родительском модуле называется _mysql.
    Ответ написан
    3 комментария
  • Примитивный модуль на C для Python течёт по памяти?

    @MikhailEdoshin
    Со списком все в порядке, проблема во взаимодействии функций. Py_BuildValue возвращает new reference, то есть объект со счетчиком ссылок, установленным в единицу, которым теперь владеет ваш код. Функция же PyList_Append не забирает у вас этот объект, а тоже увеличивает счетчик ссылок еще на единицу. Теперь у полученной строки будет два владельца — список и ваш код. Когда вы удалите список, он честно отнимет свою единичку от счетчика ссылок, но ваша-то там останется, поэтому Питон будет думать, что кто-то где-то эту строку еще использует.

    Вам нужно или явно уменьшить счетчик:

    PyObject *list, *item; /* static, право, ни к чему */
    list = PyList_New(0);
    item = Py_BuildValue("s"; "test");
    PyList_Append(list, item);
    Py_DECREF(item);
    return list;
    

    или же использовать функцию, которая не увеличивает счетчик (steals reference):

    PyObject *list;
    list = PyList_New(1); /* оставляем место для элемента */
    PyList_SET_ITEM(list, Py_BuildValue("s"; "test"));
    return list;
    

    (В данном случае я использовал макрос PyList_SET_ITEM, который как раз подходит для заполнения новых списков.)
    Ответ написан
    4 комментария
  • Как одновременно искать в тексте несколько регулярных выражений?

    @MikhailEdoshin
    Я не исследовал специально, но впечатление такое, что готового инструмента нет. Хотя конструкция кажется очевидной — есть M конечных автоматов (регексов), мы объединяем их в один (методы известны), плюс в начальном и/или конечном состоянии каждого исходного автомата устанавливаем callback с идентификатором этого автомата и позицией в тексте.

    Может быть, взять какую-нибудь библиотеку KA и из нее что-то попытаться смастерить? Для C есть libfa (порт явовской dk.brics.automaton), первую половину задачи она выполнит, а вот помеченные состояния и callback — не знаю.
    Ответ написан
    Комментировать
  • стоит ли запускать С++ из Python'а?

    @MikhailEdoshin
    Написать библиотеку на С с нужной функцией. Потребление памяти возрастет на размер получившейся библиотеки, но я так понимаю, вам нужна, главным образом, скорость. Как вариант — написать на Cython, в данном случае будет почти тоже самое, что и руками на С.
    Ответ написан
    Комментировать
  • Как выставить PYTHONIOENCODING чтобы получить читаемый юникодный текст в cmd.exe?

    @MikhailEdoshin
    Вам принципиально нужна консоль Windows? А то поставьте cygwin, там консоль в комплекте, с настройкой в том числе и кодировки.
    Ответ написан
    Комментировать
  • Необходима ли статья о использовании is с int объектами в python?

    @MikhailEdoshin
    А вот (0-5) is 5 = True :) Почему бы не написать, особенность не самая известная, пусть будет.
    Ответ написан
  • Умный pdb_trace() - как поставить брейкпоинт на конкретную итерацию?

    @MikhailEdoshin
    Можно просто жать Enter — он повторяет последнюю введенную команду. Удобно также пользоваться n[ext] — он выполняет команды, не заходя в вызываемые функции или unt[il] — выполняет команды до тех пор, пока не окажется строчкой ниже (т. е. если в последней строчке цикла сказать until, он промотает весь цикл и остановится на следующей команде. Чтобы поставить условный breakpoint, нужно сказать b[reak] ([file:]lineno | function)[, condition], например, break 42, a = 5. Команда перехода к нужной строке — j[ump]. Вот насчет отлавливания типичной ошибки не скажу — таким не пользуюсь. Но вообще такое вроде есть — например, можно завернуть вызов программы в собственный try/except, отловить ошибку, посмотреть ее текст, и если совпадает — запустить отладчик (вот тут не помню, как из кода его запустить), чтобы посмотреть стек вызовов (w[here]).

    Кстати, он вам ошибку выводит, а traceback не печатает, что ли?

    См. также руководство к модулю и внутреннюю справку (h[elp]).
    Ответ написан
  • HTTPSConnection.getresponse() ...reesponse.read() протекает память. Нет?

    @MikhailEdoshin
    А какой у вас питон и операционка, кстати?
    Ответ написан
  • HTTPSConnection.getresponse() ...reesponse.read() протекает память. Нет?

    @MikhailEdoshin
    Я бы проверил pdb этот код и на response.read вошел бы в функцию. Насколько я понимаю, это вызывается HTTPConnection.read из httplib, но там несколько вариантов — хорошо бы понять хотя бы в какую ветку идет код.
    Ответ написан
    4 комментария
  • Проверка исходников python с целью ограничить им доступ к классам проекта?

    @MikhailEdoshin
    Если модуль импортирует sys, то он может добраться до уже импортированного модуля через sys.modules, не используя явный import. Плюс у каждой питоновской функции есть func_globals, ссылка на словарь модуля, в котором она определена. Со всем содержимым модуля, естественно. Так что если вы передаете безопасную питоновскую функцию из опасного модуля, можно будет получить доступ ко всему модулю, и, соответственно, по цепочке ко всем другим модулям из которых тот что-то импортировал.
    Ответ написан
  • python3, модифицированный зип и доработанный zipimport

    @MikhailEdoshin
    Можно еще шифровать и/или подписывать сам байткод, а для расшифровки и/или проверки подписи написать import hook.
    Ответ написан
    Комментировать
  • py2exe - методика раскрытия упакованного кода

    @MikhailEdoshin
    Насколько я вижу из описания, все исходники должны быть в library.zip:
    This is a standard zip file where all the pure source modules will be inserted (using the «zipfile» option, you can also select to put that file in a sub-directory and with a different name)[.]
    Ответ написан
    4 комментария
  • Split и русские строки в Python 2.X

    @MikhailEdoshin
    То есть это нормальные строки — напечатайте, скажем, первую print my_str.replace(' ', '').split('^')[0] и увидите.
    Ответ написан
  • Сборка .app на Mac с Python, Qt, PyQt, MySQL с использованием py2app?

    @MikhailEdoshin
    Во втором случае у вас новый install path длинее, чем старый — ничего не выйдет. Там тупо под более длинный путь места нет. Нужно перекомпилировать библиотеку и перелинковать то, что с нею линкуется. Или, проще, сделать путь короче — положить библиотеку рядом с executable, а не в Frameworks (это ведь не фреймворк все равно); тогда install path будет @executable_path/libqsqlmysql.dylib :)

    (Есть, кстати специальная опция у линковщика -headerpad_max_install_names, специально для перебивания, как я понимаю, но вряд ли она была включена.)
    Ответ написан
    6 комментариев
  • Как поставлять Python cо своим приложением?

    @MikhailEdoshin
    А что вас удивляет? Сама питоновская DLL — два с небольшим мегабайта в стандартном виде, при желании ее можно еще уменьшить, если исключить ненужные встроенные модули. В .zip-файле, очевидно, хранятся зазипованный байткод — Питон может импортировать его непосредственно оттуда. (Можно, кстати, призиповать архив непосредственно к DLL или EXE.) Опять-таки если брать только реально используемые модули, архив вряд ли будет большим. Автор, как я вижу, включил еще и стандартные MS-библиотеки — в принципе, извернувшить можно слинковаться с системной msvcrt.dll, что еще уменьшит размер дистрибутива.
    Ответ написан
    Комментировать
  • Вопросы по GPL?

    @MikhailEdoshin
    Единственный вариант — если ваша программа не требует GPL-библиотеки для собственной работы. В этом случае можно издать программу под произвольной лицензией плюс написать GPL-плагин, который подсоединяет GPL-библиотеку, расширяющую функционал.
    Ответ написан
  • Python & Closed Source?

    @MikhailEdoshin
    Вот FAQ по лицензии Python. Вкратце — да, код открывать необязательно, но нужно сохранять копирайты в коде и приложить копию питоновской лицензии; при упоминании Python в документации использовать ® и указать, что это знак Python Software Foundation.

    Общепринятой лицензии на closed-source freeware нет, пишите от себя :) Ну или вот тут предлагают использовать CC-BY-NC, хотя обычно CC для ПО не используется.
    Ответ написан
    1 комментарий
  • Генерация простого числа заданного размера?

    @MikhailEdoshin
    Вот сниппет непосредственно из реализации RSA:

    def rmspp(number, attempts=28):
        """
        rmspp(n, attempts=28) -> True if n appears to be primary, else False
        rmspp: Rabin-Miller Strong Pseudoprime Test
        http://mathworld.wolfram.com/Rabin-MillerStrongPseudoprimeTest.html
        """
        if number < 2:
            return False
        if number == 2:
            return True
        if number % 2 == 0:
            return False
        # Given an odd integer n, let n = 2**r*s+1, with s odd... 
        s = number - 1
        r = 0
        while s % 2 == 0:
            r += 1
            s /= 2
        while attempts:
            # ... choose a random integer a with 1 ≤ a ≤ n-1
            a = randint(1, number-1)
            # Unless a**s % n ≠ 1 ...
            if mod_exp(a, s, number) != 1:
                # ... and a**((2**j)*s) % n ≠ -1 for some 0 ≤ j ≤ r-1 
                for j in range(0, r):
                    if mod_exp(a, (2**j)*s, number) == number-1:
                        break
                else:
                    return False
            attempts -= 1
            continue
        # A prime will pass the test for all a.
        return True
    
    def mod_exp(base, exponent, modulus):
        """
        mod_exp(b, e, m) -> value of b**e % m
        Calculate modular exponentation using right-to-left binary method.
        http://en.wikipedia.org/wiki/Modular_exponentiation#Right-to-left_binary_method
        """
        result = 1L
        while exponent > 0:
            if (exponent & 1) == 1:
                result = (result * base) % modulus
            exponent >>= 1
            base = (base * base) % modulus
        return result

    Вызывается он внутри генерации ключей (с дополнительными оптимизациями) примерно так:

    def keys(bits):
        """
        keys(bits) -> (public, private)
        Generate public and private RSA keys of the given size.
        """
        # Pragma: use a fixed e, the fourth Fermat prime (0b10000000000000001)
        e = 2**16+1
        while True:
            # Generate two large prime numbers p and q, n = pq and φ = (p-1)(q-1)
            s = bits / 2
            mask = 0b11 << (s - 2) | 0b1 # two highest and the lowest bit
            while True:
                p = getrandbits(s) | mask
                # Pragma: check p % e here to guarantee that φ and e are coprimes
                if p % e != 1 and rmspp(p): 
                    break
            s = bits - s
            mask = 0b11 << (s - 2) | 0b1 # same as above, but maybe different s
            while True:
                q = getrandbits(s) | mask
                if q != p and q % e != 1 and rmspp(q): 
                    break
            n = p * q
            phi = (p - 1) * (q - 1)
            # Pragma: e is chosen already and is relative prime to φ
            # Compute d, a modular multiplicative inverse to e (i.e. e*d % φ = 1)
            d = mmi(e, phi)
            if d: # if not, the process will repeat
                break
        return (n, e), (n, d)
    
    ef mmi(a, m):
        """
        mmi(a, m) -> x, such as ax % m = 1
        mmi is a Modular Multiplicative Inverse
        See http://en.wikipedia.org/wiki/Modular_multiplicative_inverse
        """
        gcd, x, q = egcd(a, m)
        if gcd != 1:
            # The a and m are not coprimes, so the inverse doesn't exist
            return None
        else:
            return (x + m) % m
    
    def egcd(a, b):
        """
        egcd(a, b) -> d, x, y, such as d == gcd(a, b) == ax + by
        egcd is an Extended Greatest Common Divisor
        http://en.wikipedia.org/wiki/Extended_Euclidean_algorithm
        """
        if b == 0:
            return (a, 1, 0)
        else:
            d, x, y = egcd(b, a % b)
            return d, y, x - y * (a / b)

    Насчет «доли вероятности» — насколько я помню, в алгоритме Миллера-Рабина при увеличении числа попыток вероятность ложного срабатывания легко сделать сколь угодно малой (например, меньше чем верояность отказа железа :), и, кроме того, насколько я помню, конкретно в случае с RSA полученные числа будут еще раз проверены при расчете modular multiplicative inverse, а его невозможно будет получить, если число не простое (приведенная функция keys() в таком случае продолжает цикл генерации).
    Ответ написан
    2 комментария