Уведомления

Группа в Telegram: @pythonsu

Уведомления

  • Found 3492 posts.

GUI » PyQt: QThread: утечка памяти » Авг. 5, 2014 11:58:53

python 2.7.6
PyQt 4.10.3

Приложение создаёт множество потоков и, конечно, их пытается удалить, но программа всё равно с большой скоростью раздувается в памяти. Упростил программу до следующего вида:

# -*- coding: utf-8 -*-
from PyQt4 import QtCore, QtGui
import sys
class MyThread(QtCore.QThread):
    def __init__(self, parent, n):
        QtCore.QThread.__init__(self)
        self.parent_ = parent
        self.n = n
        #self.connect(self, QtCore.SIGNAL("finished()"), self, QtCore.SLOT("deleteLater()")) - а иначе с криками """QThread::wait: Thread tried to wait on itself QThread: Destroyed while thread is still running""" падает
    def run(self):
        print self.n
        self.emit(QtCore.SIGNAL("signalMyThread(PyQt_PyObject)"), {'result': 'ok', 'n': self.n})
class Application(QtGui.QApplication):
    def __init__(self, argv):
        QtGui.QApplication.__init__(self, argv)
        self.prepare()
    def prepare(self):
        self.threads_ = {}
        self.working_threads = 0
        self.n = -1
        for x in xrange(50):
            QtCore.QTimer().singleShot(100, self.start)
    def start(self):
        self.n += 1
        if self.n > 1000000000:
            QtCore.QTimer().singleShot(100, self.finish)
            return
        n = self.n
        QtCore.QTimer().singleShot(100, lambda: self.start2(n))
    def start2(self, n):
        self.threads_[n] = MyThread(self, n)
        self.threads_[n].moveToThread(self.threads_[n])
        self.connect(self.threads_[n], QtCore.SIGNAL("signalMyThread(PyQt_PyObject)"), self.receive)
        self.working_threads += 1
        self.threads_[n].start()
    def receive(self, result):
        n = result.get('n')
        QtCore.QTimer().singleShot(100, lambda: self.killThread(n))
        QtCore.QTimer().singleShot(100, self.start)
    def killThread(self, n):
        if n not in self.threads_:
            return
        if self.threads_[n].isRunning():
            QtCore.QTimer().singleShot(100, lambda: self.killThread(n))
            return
        self.threads_[n].deleteLater()
        self.threads_.pop(n, None)
        self.working_threads -= 1
    def finish(self):
        if self.working_threads > 0:
            QtCore.QTimer().singleShot(100, self.finish)
            return
        self.quit()
if __name__=='__main__':
    app = Application(sys.argv)
    sys.exit(app.exec_())

В чём может быть дело?

GUI » [PyQt4] В Qt Assistant отсутствует документация » Авг. 1, 2014 02:38:42

Здраствуйте. Установил бинарник PyQt4. На странице загрузки написано, что документация отсутсвует. Где ее теперь взять? HTML странички есть по pyqt есть.

Флейм » Требуется Django/Python разработчик » Июль 31, 2014 10:20:18

В нашу дружную команду, требуется Django/Python разработчик.

Требования к кандидату:
1. Опыт работы с Django от 1 года.
2. Адекватность и ответственность.
3. Аналитический склад ума.
4. Честность и умение доводить работу до конца.
5. Желание развиваться в профессиональном плане.

Приветствуются:
1. Опыт работы с PostgreSQL или других RDBMS.
2. Знание Linux (Debian/Ubuntu) или других *nix.
3. Знание других языков/фреймворков (в особенности Java, php, .NET, C/C++).
4. Наличие OpenSource-проектов или участие в них.
5. Опыт работы с MongoDB, Redis, Celery.

Условия работы:
1. Постоянная удаленная работа (нам не важно, в каком городе вы живете)
2. Оплата почасовая
3. Свободный график
4. Работа над крупными интернет и корпоративными проектам в команде профессионалов

При ответе на вакансию просим указывать имя, почту для отправки тестового задания на gmail и скайп для собеседования. И было бы очень приятно получать более развернутые ответы с примерами работ на Django/Python и Ваше CV.

Ждем Ваши отклики на hr@smyt.ru или в скайп valkiriya123

Python для экспертов » Доступ к демону mod_wsgi из другого виртуального хоста » Июль 29, 2014 20:44:59

Всем привет. Помогите пожалуйста разобраться. В общем хочу поднять mod_wsgi в режиме threaded для использования в django sites. Проблема заключается в том, что не могу получить доступ к демону из другого хоста.
Решение: выносим демон за блок виртуальных хостов, присваиваем ему группу. далее через алиасы WSGIScriptAlias редиректим каждый хост на тот же wsgi-скрипт.

Python для новичков » Paramiko. Как сделать сокс-туннель через ssh? » Июль 29, 2014 20:21:01

Всем привет.
Хотелось бы узнать как средствами paramiko можно сделать SOCKS через SSH. Пример с сабпроцессами не предлагать =)
Спасибо.

Python для новичков » переназначение кнопки » Июль 26, 2014 09:29:44

Добрый день, подскажите, пожалуйста, как можно переназначить средствами питона (или виндоуса) кнопку стилуса (кнопка на боковой поверхности) на свою? по умолчанию эта кнопка служит модификатором, при котором левая конка мыши выполняется как правая.
Pyhook не отслеживает эту кнопку. В настройках виндоуса эту кнопку нельзя переназначить, можно только отключить. Драйверов к стилусу нет

Центр помощи » Парсинг больших файлов » Июль 25, 2014 16:37:30

Здравствуйте!
Программа должна перемешивать определённые слова в заданном соотношении. Определенные слова в данном случае Components=“Pb” и Components=“Cd”. Соотношение задается с помощью процентов
Проблема в том, что в промежуточном файле вывода не все искомые строки. Отсюда, когда искомые слова вставляются на исходные места, файл вывода оказывается в несколько раз короче входного.
import random, re
with open("infile.txt",'r') as f:
    lines = f.read()
component_1 = re.findall('([^\s].*?Components="Cd".*?)', lines) # что ищем
component_2 = re.findall('([^\s].*?Components="Pb".*?)', lines)
def count(com1, com2):
    result = []
    if com1 != 0:
        l_1 = len(com1)
        a = input('Cd ')
    else:
        l_1 = 0
    if com2 != 0:
        l_2 = len(com2)
        b = input('Pb ')
    else:
        l_2 = 0
    if round(l_1//100) < 1:
        nominal_1_proc = round(l_1//100)+1
    else:
        nominal_1_proc = round(l_1//100)
    if round(l_2//100) < 1:
        nominal_2_proc = round(l_2//100)+1
    else:
        nominal_2_proc = round(l_2//100)
    if com1 != 0:
        for x in range(0, int(a*nominal_1_proc)):
            result.append(com1[x])
    if com2 != 0:
        for y in range(0, int(b*nominal_2_proc)):
            result.append(com2[y])
    random.shuffle(result)
    return result
fo = open("demooutfile.txt", "w")
for y in count(component_1, component_2):
    fo.write(y)
    fo.write('\n')
fo.close()
regex3= re.compile('Components="Pb"|Components="Cd"') # что ищем
with open("infile.txt",'r') as f3:
    lines3 = f3.read()
endpos3=0
match3= regex3.search(lines3,endpos3)
matches3=[] # массив с совпадениями
strings3=[] # все остальное что не совпало, при этом если два совпадения подряд, или начало (конец) строки и совпадение, то в этот массив попадает пустая строка
    # поэтому значения в массивах чередуются относительно целевой строки
while (match3):
 strings3+= [ lines3[endpos3:match3.start()] ]
 endpos3= match3.end()
 matches3+=[match3.group(0)]
 match3= regex3.search(lines3,endpos3)
if (endpos3==len(lines3)): strings3+= [ "" ]
random.shuffle(matches3)
regex2= re.compile('Components="Pb"|Components="Cd"') # что ищем
with open("demooutfile.txt",'r') as f2:
    lines2 = f2.read()
endpos2=0
match2= regex2.search(lines2,endpos2)
matches2=[] # массив с совпадениями
strings2=[] # все остальное что не совпало, при этом если два совпадения подряд, или начало (конец) строки и совпадение, то в этот массив попадает пустая строка
    # поэтому значения в массивах чередуются относительно целевой строки
while (match2):
 strings2+= [ lines2[endpos2:match2.start()] ]
 endpos2= match2.end()
 matches2+=[match2.group(0)]
 match2= regex2.search(lines2,endpos2)
if (endpos2==len(lines2)): strings2+= [ "" ]
random.shuffle(matches2)
result3= "" # собираем строку обратно с перемешанными данными
for i in range(len(matches2)):
 result3+=strings3[i]+matches2[i]   # вместо исходного массива вставляем искомый
result3+=strings3[-1]
with open("outfilenew.txt", "w") as f4:
    f4.write(result3)

Python для новичков » Парсинг больших файлов » Июль 25, 2014 16:35:11

Здравствуйте!
Программа должна перемешивать определённые слова в заданном соотношении. Определенные слова в данном случае Components=“Pb” и Components=“Cd”. Соотношение задается с помощью процентов.
Проблема в том, что в промежуточном файле вывода не все искомые строки. Отсюда, когда искомые слова вставляются на исходные места, файл вывода оказывается в несколько раз короче входного.
import random, re
with open("infile.txt",'r') as f:
    lines = f.read()
component_1 = re.findall('([^\s].*?Components="Cd".*?)', lines) # что ищем
component_2 = re.findall('([^\s].*?Components="Pb".*?)', lines)
def count(com1, com2):
    result = []
    if com1 != 0:
        l_1 = len(com1)
        a = input('Cd ')
    else:
        l_1 = 0
    if com2 != 0:
        l_2 = len(com2)
        b = input('Pb ')
    else:
        l_2 = 0
    if round(l_1//100) < 1:
        nominal_1_proc = round(l_1//100)+1
    else:
        nominal_1_proc = round(l_1//100)
    if round(l_2//100) < 1:
        nominal_2_proc = round(l_2//100)+1
    else:
        nominal_2_proc = round(l_2//100)
    if com1 != 0:
        for x in range(0, int(a*nominal_1_proc)):
            result.append(com1[x])
    if com2 != 0:
        for y in range(0, int(b*nominal_2_proc)):
            result.append(com2[y])
    random.shuffle(result)
    return result
fo = open("demooutfile.txt", "w")
for y in count(component_1, component_2):
    fo.write(y)
    fo.write('\n')
fo.close()
regex3= re.compile('Components="Pb"|Components="Cd"') # что ищем
with open("infile.txt",'r') as f3:
    lines3 = f3.read()
endpos3=0
match3= regex3.search(lines3,endpos3)
matches3=[] # массив с совпадениями
strings3=[] # все остальное что не совпало, при этом если два совпадения подряд, или начало (конец) строки и совпадение, то в этот массив попадает пустая строка
    # поэтому значения в массивах чередуются относительно целевой строки
while (match3):
 strings3+= [ lines3[endpos3:match3.start()] ]
 endpos3= match3.end()
 matches3+=[match3.group(0)]
 match3= regex3.search(lines3,endpos3)
if (endpos3==len(lines3)): strings3+= [ "" ]
random.shuffle(matches3)
regex2= re.compile('Components="Pb"|Components="Cd"') # что ищем
with open("demooutfile.txt",'r') as f2:
    lines2 = f2.read()
endpos2=0
match2= regex2.search(lines2,endpos2)
matches2=[] # массив с совпадениями
strings2=[] # все остальное что не совпало, при этом если два совпадения подряд, или начало (конец) строки и совпадение, то в этот массив попадает пустая строка
    # поэтому значения в массивах чередуются относительно целевой строки
while (match2):
 strings2+= [ lines2[endpos2:match2.start()] ]
 endpos2= match2.end()
 matches2+=[match2.group(0)]
 match2= regex2.search(lines2,endpos2)
if (endpos2==len(lines2)): strings2+= [ "" ]
random.shuffle(matches2)
result3= "" # собираем строку обратно с перемешанными данными
for i in range(len(matches2)):
 result3+=strings3[i]+matches2[i]   # вместо исходного массива вставляем искомый
result3+=strings3[-1]
with open("outfilenew.txt", "w") as f4:
    f4.write(result3)

Python для новичков » Декомпиляция » Июль 23, 2014 11:46:16

Помогите пож декомпилировать код см вложение, уже голову сломал с ошибкой
RuntimeError: Bad magic number in .pyc file

Python для экспертов » Конвертирование диапазона ip » Июль 20, 2014 16:30:35

Есть диапазон ip например 192.168.1.0-192.168.13.0, нужно конвертировать в такой вид 192.168.1-13.* или в такой 192.168.1-13.0-255
Кто подскажет либу?

Python для экспертов » Архитектурный ступор пограмиста » Июль 18, 2014 06:00:00

Никак не могу придумать решение. Хочется примерно следующего: есть класс для запуска последовательности команд(неважные детали я убрал и добавил докстринги на русском), хочу перед исполнением команды проверить для них наличие зависимостей.
class Executor(list):
    Dependence = namedtuple('Dependence', ['executable', 'path'])
    def run(self):
	"Исполнение последовательности команд"
        self.check_depends()
        # тут запуск последовательности команд
    @classmethod
    def depend_on(cls, executable, path=None):
	"Добавляет зависимость в список в атрибуте функции __depend_on__"
		
        def wrapper(f):
            dependence = cls.Dependence(executable, path)
            if hasattr(f, '__depend_on__'):
                f.__depend_on__.append(dependence)
            else:
                f.__depend_on__ = [dependence]
            return f
        return wrapper
    def check_depends(self):
	"Проверка наличия зависимостей для последовательности команд"
        def check(dependence):
	    "Проверка зависимости"
        for x in chain(*(getattr(x.func, '__depend_on__', ()) for x in self)):
            check(x)

Вот так объявляются команды

@Executor.depend_on('hg.exe')
def load_sources(revision):
    pass
def build_executive():
    pass
@Executor.depend_on('hhc.exe')
def build_help():
    pass
@Executor.depend_on('candle.exe', WIX_PATH)
@Executor.depend_on('light.exe', WIX_PATH)
def build_installer():
    pass

А вот так они используются
executor = Executor()
executor.append(build_executive)
executor.append(build_help)
executor.run()

Все хорошо, до тех пор пока не используем декорированную функцию
executor.append(partial(load_sources, options.revision))

Ложечки нашлись Я реализовал этот кусок по другому, но осадочек остался все думаю - можно ли реализовать именно в таком синтаксисе? Есть идеи?

GUI » Перенаправление потока вывода » Июль 16, 2014 05:28:57

Здравствуйте!
Решил в качестве тренировки написать для себя на PyQt графическую оболочку для интерпретатора питона, которой работает в интерактивном режиме, аналогично работе с ним из консоли. Для этого воспользовался стандартным модулем code.InteractiveConsole() который поместил в отдельный QThread куда и посылаю команды в реальном времени. Какое то время поработал в ней и нашел парочку очень раздражающих “но”:
1) При вызове locals() помимо самих “локалс” (которые довольно затруднительно найти) выдаёт ещё прилично мусора, стандартным способом сделать спойлер не получилось, привёл его в файле.
2) При исполнении обёрток кода написанного на си, вывод идёт не в предусмотренный для этого виджет, куда перенаправлены sys.stdout sys.strerr, а в питоновский терминал (не знаю как правильно сказать, то черное окно запускающееся вместе с гуи).

Буду благодарен за ваше мнение, на счет того как это решить.

Web » Flask-admin + связь между двумя selectField » Июль 15, 2014 21:21:59

Необходимо в зависимости от первого selectField (в котором столбец из таблицы подгружен) подставить во второй связанные по id записи из другой таблицы.

Наглядно:

выбрали первый, второй обновил значения.

Код:

def MyFormDynamic(request):
    form = MyForm(request)
    form.predpr_id.choices = [(g.id, g.name) for g in Predpr.query.order_by('name')]
    form.devices_id.choices = [(g.id, g.number) for g in Devices.query.order_by('id')]
    return form
class MyForm(form.Form):
    predpr_id = fields.SelectField(u'Предприятия', choices=[], coerce=int)
    devices_id = fields.SelectField(u'Устройства', choices=[], coerce=int)
    display = fields.RadioField(u'Куда выложить:',
        choices=[
            (True, u'На сервер'),
            (False, u'Локально'),
        ],
        default=True,
    )

И еще проблема, как можно сделать подобный поиск в обычном selectField, то есть не просто раскрывающийся список, а список с возможностью поиска подстроки как в случае с relationship:

Базы данных » Каскадное удаление через relaionship(). SQLAlchemy » Июль 10, 2014 17:11:20

Хочу удалять каскадно поля в таблице M2M с обоих сторон.
Сперва добрался до рабочего варианта:
from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
 
Base = declarative_base()
 
class Association(Base):
    __tablename__ = 'exmp_association'
    parent_id = Column(Integer, ForeignKey('exmp_parent.id', ondelete='CASCADE'), primary_key=True)
    child_id = Column(Integer, ForeignKey('exmp_child.id', ondelete='CASCADE'), primary_key=
    extra_data = Column(String(50))
 
class Parent(Base):
    __tablename__ = 'exmp_parent'
    id = Column(Integer, primary_key=True)
    associations = relationship("Association", backref="parent")
  
class Child(Base):
    __tablename__ = 'exmp_child'
    id = Column(Integer, primary_key=True)
    associations = relationship("Association", backref="child")

Делаю так, всё работает:
s = get_session()
p = Parent()
a = Association()
c = Child()
a.child = c
p.associations.append(a)
s.add(p)
s.commit()
a = s.query(Association).get([1, 1])
print(s.query(Parent).count())
print(s.query(Association).count())
print(a.parent)
print(a.child)
s.query(Parent).delete()
s.commit()
print(s.query(Parent).count())
print(s.query(Association).count())

Меняю описание моделей на:
class Association(Base):
    __tablename__ = 'exmp_association'
    parent_id = Column(Integer, ForeignKey('exmp_parent.id'), primary_key=True)
    child_id = Column(Integer, ForeignKey('exmp_child.id'), primary_key=True)
    extra_data = Column(String(50))
 
class Parent(Base):
    __tablename__ = 'exmp_parent'
    id = Column(Integer, primary_key=True)
    associations = relationship("Association", backref="parent", cascade='all, delete-orphan')
 
class Child(Base):
    __tablename__ = 'exmp_child'
    id = Column(Integer, primary_key=True)
     associations = relationship("Association", backref="child", cascade='all, delete-orphan')

Выполняю тот же сценарий , что и выше, получаю ошибку:
sqlalchemy.exc.IntegrityError: (IntegrityError) update or delete on table "exmp_parent" violates foreign key constraint "exmp_association_parent_id_fkey" on table "exmp_association"
DETAIL:  Key (id)=(1) is still referenced from table "exmp_association".
 'DELETE FROM exmp_parent' {}

Что не так делаю?
Доку читал, видимо что-то недовдуплил…
Подскажите - что =)

Флейм » ИЩУ питонщика для доработки сайта МОСКВА ONLY » Июль 10, 2014 16:48:46

Москва!
Ищу человека, ОПЫТНОГО, который сможет доработать на языке Python наш сайт.
Не на один раз.
Фриланс, посещать офис минимум 1 раз в месяц.
Поддерживать сайт со всех сторон (кроме контента), любить и обнимать.
Писать мне: marketing@leonardo-travel.ru
Звать меня: Регина, PR-менеджер

Python для новичков » ООП от нуба » Июль 9, 2014 01:42:22

Суть вопроса простая когда я юзаю либу
from multiprocessing import Process
и передаю копию обекта pymongo в котормо уже настроил все что надо, правильно ли это или надо иницировать в каждом субе чтоб было быстрее.

З.Ы.
Сам не замерял но кажеться что создавать заново в каждом субе лучше.

Pyramid / Pylons / TurboGears » collectstatic для Pyramid » Июль 8, 2014 15:14:23

Всем привет.

Нужно собирать статику с каждого приложения и складывать её в одно место. Чтобы потом раздавать её nginx. Ищу что-то похожее, по функционалу, на collectstatic из Django. Может быть кто-то знает про такие инструменты? Я пока ничего не нашёл.

Python для новичков » Ошибка при работе модуля cmd » Июль 4, 2014 09:42:00

Добрый день!

Я скачал с инета скрипт-командную оболочку для JMX и хочу чтобы запускались команды не только в самой оболочки, а через специальный входной текстовый командный файл. Мне надо доработать этот командную оболочку, а я не знаю как.
Вот фрагмент кода, который берет текстовый командный файл в виде аргумента:
if __name__ == ‘__main__’:
if len(sys.argv) > 1:
try:
input = open(sys.argv, ‘rt’)
sys.stdin = input
jmxCmd(input).cmdloop()
finally:
input.close()
else:
jmxCmd().cmdloop()

Ошибка которую я получаю:


oracle@vmalkhimovopt/oracle/product/weblogic/10.3.6/user_projects/domains/scripts> jython/jython JythonJMXClient.py commands.txt
warning: /home/oracle/.jython is a directory, not a file
Traceback (most recent call last):
File “JythonJMXClient.py”, line 100, in <module>
jmxCmd(input).cmdloop()
File “/opt/oracle/product/weblogic/10.3.6/user_projects/domains/scripts/jython/Lib/cmd.py”, line 115, in cmdloop
readline.parse_and_bind(self.completekey + “: complete”)
File “/opt/oracle/product/weblogic/10.3.6/user_projects/domains/scripts/jython/Lib/cmd.py”, line 115, in cmdloop
readline.parse_and_bind(self.completekey + “: complete”)
TypeError: unsupported operand type(s) for +: ‘file’ and ‘str’

Посмотрите пожалуйста.

Полностью скрипт во вложении.

Центр помощи » помогите декомпилировать  » Июль 4, 2014 00:59:47

помогите пожалуйста декомпилировать,нужно отвязать от сервака и времени

GUI » GtkPaned cycle-child-focus смена стандартного акселератора » Июль 3, 2014 11:02:35

Доброго времени суток!
Подскажите пожалуйста как можно сменить стандартное сочетание клавиш для сигнала cycle-child-focus виджета GtkPaned?