آموزش برنامه نویسی

به روز ترین مطالب آموزشی و متدلوژی های برنامه نویسی

آموزش برنامه نویسی

به روز ترین مطالب آموزشی و متدلوژی های برنامه نویسی

آموزشگاه تحلیل داده فعالیت رسمی خود را از سال 1380 در قالب آموزشگاه تخصصی نرم افزار آغاز نموده. این موسسه از همان ابتدای تأسیس با بهره مندی از استاید حرفه ای رشته های نرم افزار و بانک های اطلاعاتی ، فعالیت تخصصی خود را در زمینه آموزش برنامه نویسی و بانک های اطلاعاتی آغاز نمود و پس از گذشت اندک زمانی توانست در زمینه نرم افزار و شبکه بعنوان یکی از حرفه ای ترین موسسات ایران ظاهر شود. با توجه به اینکه مدیریت آموزشگاه شخصاً در رشته نرم افزار تحصیل کرده و سابقه طولانی در تحلیل و طراحی و پیاده سازی نرم افزار و بانک های اطلاعاتی دارند ، خط مشی کلی موسسه بر مبنای آموزش پایه ای ، کاربردی ، عملی و تخصصی نرم افزار بنا شده است.


آدرس : خیابان شریعتی بالاتر از ملک جنب بانک صادرات طبقه دوم واحد 7
همراه: 09123840871 تلفن: 88146323 - 88146330

۳ مطلب با کلمه‌ی کلیدی «آموزش برنامه نویسی پایتون» ثبت شده است

  • ۰
  • ۰

در این مقاله از مجموعه مقاله های آموزش پایتون به بررسی کار با XML در پایتون می پردازیم..

عبارت Extensible Markup Language یا به اختصار XML به معنی زبان نشانه گذاری گسترش پذیر است که یک زبان نشانه گذاری مشابه HTML یا SGML است. کنسرسیوم وب جهان گستر این زبان را به عنوان یک استاندارد سراسری توصیه می کند. چنانچه اپلیکیشنی که قصد طراحی آن را دارید، داده های حجیم و سنگینی برای نگهداری ندارد، در آن صورت می توانید بدون زحمت طراحی دیتابیس و استفاده از پشتوانه ی SQL، اطلاعات برنامه ی خود را در قالب XMLذخیره نمایید.

 

آموزش زبان پایتون : معماری ها و توابع کتابخانه ای تحلیل گر XML Parser

کتابخانه ی استاندارد python تعدادی interface (الگوی پیاده سازی) معدود اما کارا جهت کار با XML در اختیار برنامه نویس قرار می دهد که در زیر به شرح آن ها می پردازیم. دو API و توابع کتابخانه ای پرکاربرد و ساده ای که توصیه می شود عبارتند از :

  • تابع (SAX (Simple API for XML : در این API، توابع Callback ای برای رخدادهای مورد نظر معرفی (register) می کنید و سپس به parser اجازه می دهید به تحلیل باقی فایل بپردازد. ابزار جاری برای شرایطی مفید می باشد که فایل های اپلیکیشن حجیم بوده و شما با محدودیت حافظه مواجه هستید. در واقع API حاضر فایل را از روی دیسک تحلیل و تفسیر می کند و به همین جهت هیچگاه کل فایل در حافظه بارگذاری نشده و آن را اشغال نمی کند.
  • تابع DOM (Document Object Model) : API جاری را کنسرسیوم وب جهان گستر توصیه می کند. در این API کل محتوای فایل داخل حافظه بارگذاری و به صورت درختی یا سلسله مراتبی سازماندهی می شود و کلیه ی ویژگی های یک فایل XML را به نمایش می گذارد.

تابع SAX قادر نیست هنگام کار با فایل های حجیم، اطلاعات را به سرعت DOM پردازش کند. از طرف دیگر، اگر منحصرا از DOM استفاده کنید، به ویژه برای پردازش فایل های کوچک و کم حجم، قطعا میزان قابل توجهی از منابع شما هدر می رود. SAX فایل ها را با مجوز در سطح فقط خواندن باز می کند، در حالی که DOM امکان اعمال تغییرات در فایل XML را فراهم می آورد. از آنجایی که دو API مزبور مکمل یکدیگر هستند، دلیلی وجود ندارد که از هر دو در پروژه های بزرگ استفاده نکنید. نمونه کدهای XML که در مثال های زیر استفاده کرده و به عنوان ورودی توابع پردازش و parse مورد استفاده قرار می دهیم، فایل movies.xml با محتوای زیر خواهد بود :

< collection shelf="New Arrivals">
< movie title="Enemy Behind">
< type>War, Thriller< /type>
< format>DVD< /format>
< year>2003< /year>
< rating>PG< /rating>
< stars>10< /stars>
< description>Talk about a US-Japan war< /description>
< /movie>
< movie title="Transformers">
< type>Anime, Science Fiction< /type>
< format>DVD< /format>
< year>1989< /year>
< rating>R< /rating>
< stars>8< /stars>
< description>A schientific fiction< /description>
< /movie>
< movie title="Trigun">
< type>Anime, Action< /type>
< format>DVD< /format>
< episodes>4< /episodes>
< rating>PG< /rating>
< stars>10< /stars>
< description>Vash the Stampede!< /description>
< /movie>
< type>Comedy< /type>
< format>VHS< /format>
< rating>PG< /rating>
< stars>2< /stars>
< description>Viewable boredom< /description>
< /movie>
< /collection>

 

آموزش Python : پردازش و تفسیر XML به وسیله ی توابع SAX

تابع SAX یک interface حاوی مجموعه توابع استاندارد برای تحلیل و پردازش XML به روش رخداد محور (Event-driven) است. جهت استفاده از interface یاد شده برای پردازش و فایل های XML، لازم است با ارث بری (تعریف کلاس مشتق) از xml.sax.ContentHandler، کلاس ContentHandler اختصاصی خود را ایجاد نمایید.

کلاس ContentHandler اختصاصی شما در واقع می تواند تگ ها و attribute های نسخه یا نسخه های مختلف XML را مدیریت نماید. آبجکت ContentHandler تعدادی متد برای مدیریت رخدادهای مختلف parse (پردازش و تحلیل) ارائه می دهد که parser این متدها را به هنگام بارگذاری محتوای فایل XML در حافظه و پردازش آن ها، از ContentHandler فراخوانی می کند.

متدهای startDocument و endDocument هریک به ترتیب در ابتدا و انتهای فایل XML فراخوانی می شوند. اطلاعات و داده های مربوط به کاراکترهای فایل XML از طریق پارامتر text در اختیار متد (character(text قرار می گیرد.

متد ContentHandler در ابتدا و انتهای هر المان فراخوانی می شود. اگر parser در وضعیت namespace mode قرار داشته باشد، در آن صورت متدهای (startElement(tag, attributes و (endElement(tag صدا زده می شوند و در غیر این صورت متدهای مربوطه یعنی startElementNS و endElementNS فراخوانده می شوند. در اینجا منظور از tag در واقع المان tag و attributes، آبجکت Attributes است.

در زیر سایر متدهای مهم که فهم آن ها برای کار با SAX مهم می باشد را مشاهده می کنید :

 

آموزش برنامه نویسی پایتون : متد make_parser

متد جاری یک آبجکت parser جدید ایجاد کرده و آن را در خروجی برمی گرداند. آبجکت parser که در خروجی بازگردانی می شود، اولین نوع parser است که سیستم پیدا می کند.

xml.sax.make_parser( [parser_list] )

در زیر جزئیات پارامترها به تفصیل شرح داده است :

  • پارامتر parser_list : آرگومان اختیاری متشکل از یک لیست از parser ها برای استفاده که تمامی آن ها بایستی متد make_parser را پیاده سازی می کند.

متد زیر یک مفسر و تحلیل گر نحوی SAX تعریف کرده و با استفاده از آن محتوای فایل مورد نظر را parse (تفسیر و تبدیل) می کند.

xml.sax.parse( xmlfile, contenthandler[, errorhandler])

در زیر اطلاعات پارامترهای متد فوق به تفصیل شرح داده شده است :

  • پارامتر xmlfile : این اسم فایل XML است که محتوای آن قرار است خوانده و تفسیر شود.
  • پارامتر contenthandler : آبجکت ساخته شده از کلاس ContentHandler.
  • این پارامتر اختیاری بوده و در صورت استفاده از آن بایستی یک آبجکت ErrorHandler از SAX باشد.

 

آموزش زبان پایتون : متد parseString

متد دیگری که یک تحلیل گر و مفسر SAX ایجاد کرده و رشته ی XML ارسالی را parse می کند، parseString می باشد :

xml.sax.parseString(xmlstring, contenthandler[, errorhandler])

در زیر هریک از پارامتر ها به تفصیل شرح داده شده است :

  • پارامتر xmlstring : اسم رشته ی XML که محتوا از آن خوانده می شود.
  • پارامتر contenthandler : بایستی یک آبجکت ContentHandler باشد.
  • پارامتر errorhandler : پارامتر اختیاری که یک آبجکت ErrorHandler از SAX می باشد.

مثال :

#!/usr/bin/python
import xml.sax
class MovieHandler( xml.sax.ContentHandler ):
   def __init__(self):
      self.CurrentData = ""
      self.type = ""
      self.format = ""
      self.year = ""
      self.rating = ""
      self.stars = ""
      self.description = ""
   # Call when an element starts
   def startElement(self, tag, attributes):
      self.CurrentData = tag
      if tag == "movie":
         print "*****Movie*****"
         title = attributes["title"]
         print "Title:", title
   # Call when an elements ends
   def endElement(self, tag):
      if self.CurrentData == "type":
       print "Type:", self.type
      elif self.CurrentData == "format":
         print "Format:", self.format
      elif self.CurrentData == "year":
         print "Year:", self.year
      elif self.CurrentData == "rating":
         print "Rating:", self.rating
      elif self.CurrentData == "stars":
         print "Stars:", self.stars
      elif self.CurrentData == "description":
         print "Description:", self.description
      self.CurrentData = ""
   # Call when a character is read
   def characters(self, content):
      if self.CurrentData == "type":
         self.type = content
      elif self.CurrentData == "format":
         self.format = content
      elif self.CurrentData == "year":
         self.year = content
      elif self.CurrentData == "rating":
         self.rating = content
      elif self.CurrentData == "stars":
         self.stars = content
      elif self.CurrentData == "description":
         self.description = content
if ( __name__ == "__main__"):
   # create an XMLReader
   parser = xml.sax.make_parser()
   # turn off namepsaces
   parser.setFeature(xml.sax.handler.feature_namespaces, 0)
   # override the default ContextHandler
   Handler = MovieHandler()
   parser.setContentHandler( Handler )
   parser.parse("movies.xml")

خروجی :

*****Movie*****
Title: Enemy Behind
Type: War, Thriller
Format: DVD
Year: 2003
Rating: PG
Stars: 10
Description: Talk about a US-Japan war
*****Movie*****
Title: Transformers
Type: Anime, Science Fiction
Format: DVD
Year: 1989
Rating: R
Stars: 8
Description: A schientific fiction
*****Movie*****
Title: Trigun
Type: Anime, Action
Format: DVD
Rating: PG
Stars: 10
Description: Vash the Stampede!
*****Movie*****
Title: Ishtar
Type: Comedy
Format: VHS
Rating: PG
Stars: 2
Description: Viewable boredom

 

آموزش Python : پردازش و تفسیر فایل های XML با استفاده از توابع DOM

مدل شی گرای فایل (Document Object Model) یا به اختصار DOM یک API و مجموع توابع کتابخانه ای است که کنسرسیوم وب جهان گستر برای دسترسی و ویرایش محتوای فایل های XML، به توسعه دهندگان توصیه می کند. DOMبه ویژه برای اپلیکیشن هایی که لازم است به محتوای فایل XML آن به صورت رندوم دسترسی صورت گیرد، مفید می باشد. SAX به توسعه دهنده امکان دسترسی فقط به یک قسمت از فایل XML را در آن واحد می دهد. به طور مثال، هنگام دسترسی به یک المان از فایل XML، امکان دسترسی به سایر المان های فایل برای شما وجود ندارد.

ماژول xml.dom، به شما این امکان را می دهد تا یک آبجکت minidom ایجاد کرده و محتوای فایل XML را به سرعت در حافظه بارگذاری نمایید. آبجکت minidom متد کارا و ساده تری جهت ساخت درخت DOM از فایل XML در اختیار توسعه دهنده قرار می دهد.

نمونه کد زیر متد ([parse(file [,parser از آبجکت minidom را صدا زده و محتوای فایل XML را تجزیه و به آبجکت درخت DOM تبدیل می کند.

مثال :

#!/usr/bin/python
from xml.dom.minidom import parse
import xml.dom.minidom
# Open XML document using minidom parser
DOMTree = xml.dom.minidom.parse("movies.xml")
collection = DOMTree.documentElement
if collection.hasAttribute("shelf"):
   print "Root element : %s" % collection.getAttribute("shelf")
# Get all the movies in the collection
movies = collection.getElementsByTagName("movie")
# Print detail of each movie.
for movie in movies:
   print "*****Movie*****"
   if movie.hasAttribute("title"):
      print "Title: %s" % movie.getAttribute("title")
   type = movie.getElementsByTagName('type')[0]
   print "Type: %s" % type.childNodes[0].data
   format = movie.getElementsByTagName('format')[0]
   print "Format: %s" % format.childNodes[0].data
   rating = movie.getElementsByTagName('rating')[0]
   print "Rating: %s" % rating.childNodes[0].data
   description = movie.getElementsByTagName('description')[0]
   print "Description: %s" % description.childNodes[0].data

خروجی :

Root element : New Arrivals
*****Movie*****
Title: Enemy Behind
Type: War, Thriller
Format: DVD
Rating: PG
Description: Talk about a US-Japan war
*****Movie*****
Title: Transformers
Type: Anime, Science Fiction
Format: DVD
Rating: R
Description: A schientific fiction
*****Movie*****
Title: Trigun
Type: Anime, Action
Format: DVD
Rating: PG
Description: Vash the Stampede!
*****Movie*****
Title: Ishtar
Type: Comedy
Format: VHS
Rating: PG
Description: Viewable boredom

 

با دیگر مقالات آموزش پایتون همراه ما باشید..

  • افشین رفوآ
  • ۰
  • ۰

در این مقاله از سری مقاله های آموزش پایتون به معرفی multi threaded در پایتون می پردازیم :

اجرای همزمان چندین thread به منزله اجرای همزمان چندین برنامه در آن واحد است که مزایای زیر را به دنبال دارد :

  • چندین thread که در بستر یک پردازه یا فرایند (process) اجرا شده و data space یکسانی را دارند، می توانند داده ها را بهتر با یکدیگر به اشتراک گذاشته و بایکدیگر تعامل بهتری داشته باشند، نسبت به زمانی که این thread ها در فرایندهای مجزا قرار دارند.
  • گاهی thread ها را پردازه یا فرایندهای سبک می نامند که سربار و memory overhead کمتری نسبت به فرایندهای واقعی داشته و کم هزینه تر می باشند.

هر thread یک نقطه ی آغاز،یک ترتیب یا توالی اجرا و یک نقطه ی پایان دارد. علاوه بر آن، یک instruction pointer دارد که دقیقا مشخص می کند برنامه در کجای بستر (context) جاری در حال اجرا بود و به کدام مرحله و نقطه اجرای دستور رسیده است.

  • می توان thread را مختل یا متوقف (pre-empt) کرد.
  • می توان thread را در حالی که دیگر thread ها فعال هستند، به طور موقت به حالت تعلیق درآورد. از این کار تحت عنوان yielding نیز یاد می شود.

 

آموزش Python : راه اندازی و اجرای thread جدید

جهت آغاز یک thread جدید، بایستی متد زیر که داخل ماژول thread کپسوله شده را فراخوانی نمایید :

thread.start_new_thread ( function, args[, kwargs] )

به وسیله ی این متد می توانید به روش سریع و کارا در هر دو محیط ویندوز و لینوکس thread های جدید ایجاد نمایید.

متد مورد نظر بلافاصله بازگشته و thread فرزند آغاز می شود که متعاقبا function را با پارامتر args صدا می زند. زمانی که function به return می رسد، thread خاتمه می یابد.

در این تابع، پارامتر args مجموعه ی چندتایی از آرگومان ها (tuple) است. اگر می خواهید تابع را بدون آرگومان صدا بزنید، بایستی یک tuple خالی به عنوان پارامتر ارسال کنید. kwargs یک آرگومان از نوع dictionary تشکیل شده از کلیدواژه ها بوده و استفاده از آن اختیاری است.

مثال :

#!/usr/bin/python
import thread
import time
# Define a function for the thread
def print_time( threadName, delay):
   count = 0
   while count < 5:
      time.sleep(delay)
      count += 1
      print "%s: %s" % ( threadName, time.ctime(time.time()) )
# Create two threads as follows
try :
   thread.start_new_thread( print_time, ("Thread-1", 2, ) )
   thread.start_new_thread( print_time, ("Thread-2", 4, ) )
except:
   print "Error: unable to start thread"
while 1:
   pass

خروجی :

Thread-1: Thu Jan 22 15:42:17 2009
Thread-1: Thu Jan 22 15:42:19 2009
Thread-2: Thu Jan 22 15:42:19 2009
Thread-1: Thu Jan 22 15:42:21 2009
Thread-2: Thu Jan 22 15:42:23 2009
Thread-1: Thu Jan 22 15:42:23 2009
Thread-1: Thu Jan 22 15:42:25 2009
Thread-2: Thu Jan 22 15:42:27 2009
Thread-2: Thu Jan 22 15:42:31 2009
Thread-2: Thu Jan 22 15:42:35 2009

اگرچه توصیه می شود که برای پردازش موازی سطح پایین (low-level threading) از ماژول thread استفاده نمایید، با این وجود ماژول مزبور در مقایسه با ماژول جدید برنامه نویسی موازی (threading module) از قابلیت های بسیار کمتری برخوردار است.

 

آموزش برنامه نویسی پایتون : ماژول Threading

ماژول جدیدتری که برای برنامه نویسی موازی همراه با ویرایش 2.4 زبان Python ارائه شد، قابلیت های بسیار بیشتر و سطح بالاتری جهت بهره گیری از پردازش موازی و thread ها در اختیار برنامه نویس قرار داد.

ماژول threading علاوه بر تمامی توابع ماژول قبلی (thread)، تعدادی متد نوین و کارای دیگر جهت پیاده سازی مفهوم برنامه نویسی موازی ارائه می دهد.

  • متد threading.activeCount() : تعداد آبجکت های thread که فعال و در حال اجرا هستند را بازگردانی می نماید.
  • متد threading.currentThread() : همان thread جاری را به عنوان خروجی برمی گرداند.

علاوه بر متدها، ماژول نام برده کلاس Thread را شامل می شود که threading و پردازش موازی را پیاده سازی می کند. متدهایی که که کلاس Thread در اختیار توسعه دهنده قرار می دهد، به شرح زیر می باشد :

  • متد ()run : متد جاری در واقع entry point یا نقطه ی شروع اجرای thread می باشد.
  • متد start() : thread را با فراخوانی تابع run() راه اندازی و اجرا می کند.
  • متد ([Join ([time : متد join() منتظر می ماند تا thread ها خاتمه یابند.
  • متد ()isAlive : متد حاضر بررسی می کند آیا یک thread هنوز در حل اجرا است یا خیر.
  • متد ()getName : متد جاری اسم آبجکت thread را بازیابی می کند.
  • متد ()setName : این متد اسم thread را مقداردهی می کند.

 

دوره آموزش پایتون : ساخت آبجکت Thread از ماژول Threading

به منظور پیاده سازی یک thread جدید از ماژول threading، کافی است مراحل زیر را دنبال نمایید:

  • یک کلاس مشتق از کلاس Thread ایجاد نمایید (از آن ارث بری کنید).
  • متد _[(init_(self[,args را جهت تزریق آرگومان های بیشتر به کلاس، بازنویسی (override) نمایید.
  • در پایان، متد [(run(self[,args را پیاده سازی و در بدنه ی آن مشخص کنید که thread به هنگام اجرا چه عملیاتی را انجام دهد.

پس از ایجاد کلاس مشتق (ارث بری) از Thread، می توانید یک نمونه از آن ایجاد کرده و سپس با فراخوانی متد start() یک thread یا ریزپردازه ی دیگر آغاز نمایید که متعاقبا متد run() را صدا می زند.

مثال :

#!/usr/bin/python
import threading
import time
exitFlag = 0
class myThread (threading.Thread):
    def __init__(self, threadID, name, counter):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name
        self.counter = counter
    def run(self):
        print "Starting " + self.name
        print_time(self.name, self.counter, 5)
        print "Exiting " + self.name
def print_time(threadName, delay, counter):
    while counter:
        if exitFlag:
            threadName.exit()
        time.sleep(delay)
        print "%s: %s" % (threadName, time.ctime(time.time()))
        counter -= 1
# Create new threads
thread1 = myThread(1, "Thread-1", 1)
thread2 = myThread(2, "Thread-2", 2)
# Start new Threads
thread1.start()
thread2.start()
print "Exiting Main Thread"

زمانی که کد فوق به اجرا گذاشته می شود، خروجی به صورت زیر خواهد بود :

Starting Thread-1
Starting Thread-2
Exiting Main Thread
Thread-1: Thu Mar 21 09:10:03 2013
Thread-1: Thu Mar 21 09:10:04 2013
Thread-2: Thu Mar 21 09:10:04 2013
Thread-1: Thu Mar 21 09:10:05 2013
Thread-1: Thu Mar 21 09:10:06 2013
Thread-2: Thu Mar 21 09:10:06 2013
Thread-1: Thu Mar 21 09:10:07 2013
Exiting Thread-1
Thread-2: Thu Mar 21 09:10:08 2013
Thread-2: Thu Mar 21 09:10:10 2013
Thread-2: Thu Mar 21 09:10:12 2013
Exiting Thread-2

 

آموزش Python : همزمان سازی thread ها

ماژول threading که در بالا به آن اشاره کردیم، یک مکانیزم اعمال قفل با قابلیت پیاده سازی آسان در اختیار توسعه دهنده قرار می دهد که به واسطه ی آن می توان به راحتی thread ها و اجرای آن ها را هماهنگ ساخت. جهت ساخت و اعمال قفل جدید کافی است متد Lock() فراخوانی شود که در خروجی نمونه ی جدید از آبجکت lock را بازگردانی می نماید.

متد acquire(blocking) از نمونه ی (آّبجکت) جدید lock، این قابلیت را دارد که با مدیریت thread ها آن ها را به طور همزمان (موازی) اجرا کند. به واسطه ی پارامتر اختیاری blocking توسعه دهنده قادر خواهد بود کنترل اینکه آیا قفل بر روی thread اعمال شود یا خیر را بدست گیرد.

زمانی که مقدار پارامتر blocking برابر 0 باشد، اگر قفل یا lock بر روی thread اعمال شد،متد با 1 و اگر نشد با 0 برمی گردد. هنگامی که blocking روی 1 تنظیم شده باشد، thread مسدود (block) شده و منتظر می ماند تا lock آزاد شود.

زمانی که متد release() از نمونه ی جدید lock صدا خورده می شود، lock یا قفل اعمال شده بر روی thread که دیگر کاربردی ندارد، آزاد می شود.

مثال :

#!/usr/bin/python
import threading
import time
exitFlag = 0
class myThread (threading.Thread):
    def __init__(self, threadID, name, counter):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name
        self.counter = counter
    def run(self):
        print "Starting " + self.name
        print_time(self.name, self.counter, 5)
        print "Exiting " + self.name
def print_time(threadName, delay, counter):
    while counter:
        if exitFlag:
            threadName.exit()
        time.sleep(delay)
        print "%s: %s" % (threadName, time.ctime(time.time()))
        counter -= 1
# Create new threads
thread1 = myThread(1, "Thread-1", 1)
thread2 = myThread(2, "Thread-2", 2)
# Start new Threads
thread1.start()
thread2.start()
print "Exiting Main Thread"

خروجی :

Starting Thread-1
Starting Thread-2
Thread-1: Thu Mar 21 09:11:28 2013
Thread-1: Thu Mar 21 09:11:29 2013
Thread-1: Thu Mar 21 09:11:30 2013
Thread-2: Thu Mar 21 09:11:32 2013
Thread-2: Thu Mar 21 09:11:34 2013
Thread-2: Thu Mar 21 09:11:36 2013
Exiting Main Thread

 

آموزش پایتون : پیاده سازی queue بوسیله multi thread در پایتون

ماژول Queue به توسعه دهنده این امکان را می دهد تا یک آبجکت queue جدید ایجاد کند که همزمان چندین آیتم را به طور صف بندی شده در خود کپسوله می نماید. برای مدیریت Queue می توانید از توابع زیر استفاده نمایید :

  • تابع get() : متد جاری یک آیتم را حذف و از queue بازیابی می کند.
  • تابع put() : این متد یک آیتم جدید را به queue اضافه می کند.
  • تابع qsize() : تعداد آیتم هایی که در زمان حاضر داخل صف قرار دارند را به عنوان خروجی بازمی گرداند.
  • تابع empty() : چنانچه صف یا آبجکت queue خالی بود، مقدار بولی True و در غیر این صورت False را بازمی گرداند.
  • تابع full() : چنانچه آبجکت queue ظرفیت خالی نداشت، مقدار بولی True و در غیر این صورت False را بازگردانی می نماید.

مثال :

#!/usr/bin/python
import Queue
import threading
import time
exitFlag = 0
class myThread (threading.Thread):
    def __init__(self, threadID, name, q):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name
        self.q = q
    def run(self):
        print "Starting " + self.name
        process_data(self.name, self.q)
        print "Exiting " + self.name
def process_data(threadName, q):
    while not exitFlag:
        queueLock.acquire()
        if not workQueue.empty():
            data = q.get()
            queueLock.release()
            print "%s processing %s" % (threadName, data)
        else:
            queueLock.release()
        time.sleep(1)
threadList = ["Thread-1", "Thread-2", "Thread-3"]
nameList = ["One", "Two", "Three", "Four", "Five"]
queueLock = threading.Lock()
workQueue = Queue.Queue(10)
threads = []
threadID = 1
# Create new threads
for tName in threadList:
    thread = myThread(threadID, tName, workQueue)
    thread.start()
    threads.append(thread)
    threadID += 1
# Fill the queue
queueLock.acquire()
for word in nameList:
    workQueue.put(word)
queueLock.release()
# Wait for queue to empty
while not workQueue.empty():
    pass
# Notify threads it's time to exit
exitFlag = 1
# Wait for all threads to complete
for t in threads:
    t.join()
print "Exiting Main Thread"

نتیجه :

Starting Thread-1
Starting Thread-2
Starting Thread-3
Thread-1 processing One
Thread-2 processing Two
Thread-3 processing Three
Thread-1 processing Four
Thread-2 processing Five
Exiting Thread-3
Exiting Thread-1
Exiting Thread-2
Exiting Main Thread

با دیگر مقالات آموزش پایتون همراه ما باشید...

  • افشین رفوآ
  • ۰
  • ۰

در این مقاله به آموزش ارسال ایمیل با پایتون و چگونگی استفاده از SMTP در پایتون را با یکدیگر مورد بررسی قرار می دهیم..

 

فرستادن ایمیل با SMTP در پایتون

عبارت Simple Mail Transfer Protocol یا به اختصار SMPT (پروتکل ارسال و انتقال ایمیل) معرفی پروتکلی است که ارسال ایمیل و آدرس دهی (routing) آن بین سرویس دهنده های ایمیل را مدیریت می کند.

پایتون ماژولی به نام smtplib در اختیار توسعه دهنده قرار می دهد که یک آبجکت حاوی اطلاعات session ( اطلاعات جلسه ی کاری کاربر یا client session object) را در خود به صورت کپسوله داشته و می توان از آن برای ارسال ایمیل به هر دستگاه آنلاینی که listener daemon (برنامه ی ای که به رخدادها گوش داده و در پس زمینه فعالیت می کند) SMTP یا ESMTP بر روی آن فعال است، استفاده نمود. در زیر نحوه ی ساخت یک آبجکت SMTP ساده که بعده ها جهت ارسال ایمیل مورد استفاده قرار می گیرد، را مشاهده می کنید :

import smtplib
smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )

 

در زیر شرح کاربرد هر یک از پارامترهای عنوان شده در قطعه کد بالا را مشاهده می کنید :

  • پارامتر host : پارامتر جاری همان میزبان یا هاستی است که به عنوان سرویس دهنده ی SMTP شما ایفای نقش می کند (SMTP server شما بر روی آن اجرا می شود). شما می توانید مقدار این پارامتر را آدرس IP میزبان یا اسم دامنه همچون tahlildadeh.com تنظیم نمایید. استفاده از این آرگومان اختیاری است.
  • پارامتر port : در صورت مقداردهی آرگومان اول، لازم است یک پورت یا شماره ی درگاه نیز مشخص نمایید که SMPT Server به آن گوش می دهد. شماره ی این پورت معمولا 25 می باشد.
  • پارامتر local_hostname : چنانچه SMPT Server شما بر روی دستگاه محلی (کامپیوتر شخصی) مستقر و فعال باشد، در آن صورت کافی است مقدار این پارامتر را localhost قرار دهید.

در آبجکت SMPT متدی تعبیه شده به نام sendmail که اغلب، توسعه دهنده با استفاده از آن کار عملیات ارسال پیغام مورد نظر را به انجام می رساند. متد نام برده در کل سه پارامتر ورودی دریافت می کند که به شرح زیر می باشند :

  • پارامتر sender : یک مقدار رشته ای دربردارنده آدرس ارسال کننده پیغام.
  • پارامتر receivers : لیستی از رشته ها که هریک مختص به دریافت کننده ی مجزا می باشد.
  • پارامتر message : یک پیغام به صورت رشته و فرمت دهی شده بر اساس مشخصات و قواعد RFC ها.

مثال :

در زیر یک اسکریپت ساده پایتون را مشاهده می کنید که ایمیلی را ارسال می کند.

#!/usr/bin/python
import smtplib
sender = 'from@fromdomain.com'
receivers = ['to@todomain.com']
message = """From: From Person
To: To Person
Subject: SMTP e-mail test
This is a test e-mail message.
"""
try:
smtpObj = smtplib.SMTP('localhost')
smtpObj.sendmail(sender, receivers, message)
print "Successfully sent email"
   except SMTPException:
   print "Error: unable to send email"

 

در تمرین جاری، یک ایمیل ساده داخل متغیر message و کوتیشن سه تایی درج گردید و همان طور که می بینید، هدرها به روش صحیح فرمت دهی شده اند. هر ایمیل، سه هدر به ترتیب From ،To و Subject که به وسیله ویرگول از هم و به وسیله خط سفید از بدنه پیغام جدا شده اند را شامل می شود.

به منظور ارسال ایمیل، ابتدا با استفاده از smtpObj به SMPT Server (سرویس دهنده ی سرور) مستقر بر روی دستگاه محلی (local) وصل شوید، سپس متد sendmail را فراخوانی کرده و پیغام، آدرس فرم و آدرس مقصد را به عنوان پارامتر به این متد ارسال نمایید (اگرچه فرم و آدرس داخل خود ایمیل گنجانده شده، با این حال از این مقدارها همیشه برای آدرس دهی یا route ایمیل استفاده نمی شود).

چنانچه شما برای ارسال ایمیل از SMPT Server که بر روی دستگاه شما (local) شما نصب و اجرا شده، استفاده نمی کنید، در آن صورت می توانید با استفاده از smtplib client به یک سرور SMPT راه دور متصل شوید. برای این منظور لازم است ارائه دهنده ی ایمیل جزئیات و اطلاعات mail server خروجی دهنده را در اختیار شما قرار داده باشد و شما نیز آن ها را به صورت زیر بکار ببرید، مگر اینکه برای ارسال ایمیل از یک سرویس آماده همچون Hotmail و Yahoo استفاده نمایید که در آن صورت نیازی به این اطلاعات نیست.

smtplib.SMTP('mail.your-domain.com', 25)

 

ارسال فایل ایمیل به صورت HTML با استفاده از Python

زمانی که توسعه دهنده یک پیغام متنی را با استفاده از Python ارسال می کند، تمامی محتوای فایل به عنوان متن ساده در نظر گرفته می شود. به عبارت دیگر حتی اگر تگ های HTML را در پیغام متنی بگنجانید، باز هم محتوای فایل به صورت متن ساده نمایش داده شده و تگ های HTML بر اساس گرامر زبان نشانه گذاری HTML فرمت دهی نمی شوند. پایتون امکانی را در اختیار توسعه دهنده قرار می دهد که به واسطه ی آن می توان یک پیغام HTML را به صورت یک فایل واقعی HTML ارسال کرد.

به هنگام ارسال یک ایمیل، می توان نوع فایل (Mime version)، نوع محتوا و مجموعه کاراکتری که باید به صورت یک ایمیل HTML ارسال شود را مشخص نمایید.

مثال :

در زیر کدی را مشاهده می کنید که محتوایی با فرمت HTML را به صورت ایمیل ارسال می کند :

#!/usr/bin/python
import smtplib
message = """From: From Person
To: To Person
MIME-Version: 1.0
Content-type: text/html
Subject: SMTP HTML e-mail test
This is an e-mail message to be sent in HTML format
< b>This is HTML message.< /b>
< h1>This is headline.< /h1>
"""
try:
   smtpObj = smtplib.SMTP('localhost')
   smtpObj.sendmail(sender, receivers, message)   
   print "Successfully sent email"
except SMTPException:
   print "Error: unable to send email"

 

 

ارسال محتوا همراه با ایمیل در پایتون

جهت ارسال ایمیل با محتوای مختلط، لازم است مقدار هدر Content-type را برابر multipart/mixed قرار دهید. پس از آن، متن و محتوای الصاقی (attachment) را در boundaries دقیقا اعلان کنید. برای تعریف boundary، دو خط تیره (هایفن) و یک عدد منحصربفرد درج کنید که این بخش نباید در بدنه ی ایمیل یا بخش پیغام ظاهر شود. سپس یک boundary نهایی درج می کنید که نشانگر بخش پایانی ایمیل بوده و باید به دو خط تیره ختم شود. فایل های الصاق شده باید قبل از ارسال، به وسیله ی تابع pack("m") بر مبنای الگوریتم و روش کدگذاری base64 رمزنگاری شوند.

مثال :

در مثال زیر، فایل /tmp/test.txt به عنوان محتوای الصاقی همراه با ایمیل ارسال می شود :

#!/usr/bin/python
import smtplib
import base64
filename = "/tmp/test.txt"
# Read a file and encode it into base64 format
fo = open(filename, "rb")
filecontent = fo.read()
encodedcontent = base64.b64encode(filecontent)  # base64
sender = 'webmaster@tutorialpoint.com'
reciever = 'amrood.admin@gmail.com'
marker = "AUNIQUEMARKER"
body ="""
This is a test email to send an attachement.
"""
# Define the main headers.
part1 = """From: From Person
To: To Person
Subject: Sending Attachement
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=%s
--%s
""" % (marker, marker)
# Define the message action
part2 = """Content-Type: text/plain
Content-Transfer-Encoding:8bit
%s
--%s
""" % (body,marker)
# Define the attachment section
part3 = """Content-Type: multipart/mixed; name=\"%s\"
Content-Transfer-Encoding:base64
Content-Disposition: attachment; filename=%s
%s
--%s--
""" %(filename, filename, encodedcontent, marker)
message = part1 + part2 + part3
try:
   smtpObj = smtplib.SMTP('localhost')
   smtpObj.sendmail(sender, reciever, message)
   print "Successfully sent email"
except Exception:
   print "Error: unable to send email"

 

با دیگر مقاله های ما در زمینه آموزش پایتون همراه ما باشید...

  • افشین رفوآ