Архив метки: Python

Определение текущей дирректории в Python

import os

#получим полный путь до текущего файла
path = os.path.abspath(os.path.dirname(__file__))

#получим путь на уровень выше
path = os.path.split(path)[0]

#и ещё на уровень, нам же на 2 уровня подняться надо
path = os.path.split(path)[0]

print path

#в path и будет путь.
#можно покороче

print os.path.split(os.path.split(os.path.abspath(os.path.dirname(__file__)))[0])[0]

Автор: D1VER
Дата публикации: 2013-10-17T06:47:00.003-07:00

Python, функция return нескольких значений

Несколько возвращаемых значений

Функции Python могут возвращать больше одного значения. Предположим, есть функция вида:

frac{dy}{dt} = v_0 - gt.

Для того чтобы возвратить несколько требуемых значений, достаточно перечислить их через запятую в инструкции return:

def yfunc(t, v0):
g = 9.81
y = v0*t - 0.5*g*t**2
dydt = v0 - g*t
return y, dydt

Когда далее будет вызывана yfunc, необходимо в левой части операции присваивания указать две переменные, в которые будут записаны два значения:

position, velocity = yfunc(0.6, 3)

Автор: D1VER
Дата публикации: 2013-09-17T00:04:00.001-07:00

Курсы во Львове

14-15 сентября буду читать немного ужатый вариант курсов по асинхронному сетевому программированию.
Подробности здесь.

Автор: Andrew Svetlov

Отправка email при помощи python

В этом сообщении будет показано как, используя
Python, отправлять email-сообщения, причём будет показано как добавить файл-вложение в письмо.

Пример 1.

import smtplib   
from email.mime.text import MIMEText
me = 'admin@mail.ru'
you = 'kot_smit@mail.ru'
smtp_server = 'smtp.mail.ru'
msg = MIMEText('Message e-mail')
msg['Subject'] = 'The contents of '
msg['From'] = me
msg['To'] = you
s = smtplib.SMTP(smtp_server)
s.sendmail(me, [you], msg.as_string())
s.quit()
 
  

Если нужно использовать свой smtp-сервер, то в строке

s = smtplib.SMTP(smtp_server)

переменную smtp_server указывать просто не надо. таким образом строка преобретает вид —

s = smtplib.SMTP()

затем нужно добавить строку

s.connect()
 
 

Пример 2.
Отправка письма с вложением, используется smpt.yandex.ru

from smtplib import SMTP_SSL
from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from email import Encoders
import os

filepath = "/path/to/file"
basename = os.path.basename(filepath)
address = "name@server"

# Compose attachment
part = MIMEBase('application', "octet-stream")
part.set_payload(open(filepath,"rb").read() )
Encoders.encode_base64(part)
part.add_header('Content-Disposition', 'attachment; filename="%s"' % basename)

# Compose message
msg = MIMEMultipart()
msg['From'] = address
msg['To'] = address
msg.attach(part)

# Send mail
smtp = SMTP_SSL()
smtp.connect('smtp.yandex.ru')
smtp.login(address, 'password')
smtp.sendmail(address, address, msg.as_string())
smtp.quit()


Автор: D1VER
Дата публикации: 2013-09-01T22:32:00.001-07:00

Определение главного потока приложения

В многопоточной программе все потоки равны, но один всё же несколько выделяется. Это — главный поток.

Главным потоком называется тот, который создаётся при запуске процесса операционной системой. Потом программа может наплодить себе разных потоков на собственные нужды, но главный есть всегда.

Иногда нужно знать, код исполняется в главном потоке или нет. Например, работать с UNIX сигналами можно только из главного потока. Различные GUI библиотеки часто тоже хотят выполняться непременно в главном потоке и никаком другом.

Если мы пишем приложение, то всегда можно придумать тот или иной способ узнать главный поток. Например, при старте, когда других потоков ещё нет, узнать идентификатор потока через threading.get_ident() и запомнить его где-нибудь.

Когда создаём библиотеку такой способ не всегда подходит. А в самом питоне нет официального способа определить, главный поток это или нет.

Зато работают пара хаков.

Тест на главность потока:

isinstance(threading.current_thread(), threading._MainThread)

Идентификатор главного потока:

threading._shutdown.__self__.ident

Используются непубличные механизмы, но это всё же лучше чем ничего.

P.S. В Python 3.4 появится функция threading.main_thread(), которая возвращает объект главного потока. А до тех пор пользуемся хаками.

Автор: Andrew Svetlov

Celery, начало работы

Данное сообщение является одним из многих, которые будут написаны в процессе изучения Celery.

Celery — «distributed task queue». Это распределенная асинхронная очередь заданий, которая обладает широким функционалом.

Celery умеет:

  • Выполнять задания асинхронно или синхронно
  • Выполнять периодические задания(умная замена crond)
  • Выполнять отложенные задания
  • Распределенное выполнение (может быть запущен на N серверах)
  • В пределах одного worker'а возможно конкурентное выполнение нескольких задач(одновременно)
  • Выполнять задание повторно, если вылез exception
  • Ограничивать количество заданий в единицу времени(rate limit, для задания или глобально)
  • Routing заданий(какому worker'у что делать)
  • Несложно мониторить выполнение заданий
  • Выполнять подзадания
  • Присылать отчеты об exception'ах на email
  • Проверять выполнилось ли задание(удобно для построения Ajax приложений, где юзер ждет факта завершения)

Для использования нужно

 >>> from celery import Celery
>>> celery = Celery()
>>> celery

 В последней строке показано имя класса Celery, имя текущего основного модуля (__main__) и адреса памяти объекта (0x100469fd0).

Всякий раз при добавлении задания, задание добавляется в локальный реестр.

Варианты использования:

  • если задача оформлена как модуль, то запускается как программа,
  •  

Автор: D1VER
Дата публикации: 2013-08-29T01:18:00.000-07:00