µ±ÎÒ¿ªÊ¼Ñ§Ï°PythonµÄʱºò£¬ÓÐЩÊÂÎÒÏ£ÍûÎÒÒ»Ôç¾ÍÖªµÀ¡£ÎÒ»¨·ÑÁ˺ܶàʱ¼ä²Åѧ»áÕâЩ¶«Î÷¡£ÎÒÏëÒª°ÑÕâÐ©ÖØµã¶¼±à×뵽һƪÎÄÕµ±ÖС£ÕâÆªÎÄÕµÄÄ¿±ê¶ÁÕߣ¬ÊǸոտªÊ¼Ñ§Ï°PythonÓïÑÔµÄÓоÑéµÄ³ÌÐòÔ±£¬ÏëÒªÌø¹ýǰ¼¸¸öÔÂÑо¿PythonʹÓõÄÄÇЩËûÃÇÒѾÔÚÓõÄÀàËÆ¹¤¾ß¡£°ü¹ÜÀíºÍ±ê×¼¹¤¾ßÕâÁ½½Ú¶ÔÓÚ³õѧÕßÀ´ËµÍ¬ÑùºÜÓаïÖú¡£
ÎҵľÑéÖ÷Òª»ùÓÚPython 2.7£¬µ«ÊÇ´ó¶àÊýµÄ¹¤¾ß¶ÔÈκΰ汾¶¼ÓÐЧ¡£
Èç¹ûÄã´ÓÀ´Ã»ÓÐʹÓùýPython£¬ÎÒÇ¿ÁÒ½¨ÒéÄãÔĶÁPython introduction£¬ÒòΪÄãÐèÒªÖªµÀ»ù±¾µÄÓï·¨ºÍÀàÐÍ¡£
°ü¹ÜÀí
PythonÊÀ½ç×î°ôµÄµØ·½Ö®Ò»£¬¾ÍÊÇ´óÁ¿µÄµÚÈý·½³ÌÐò°ü¡£Í¬Ñù£¬¹ÜÀíÕâЩ°üÒ²·Ç³£ÈÝÒס£°´ÕÕ¹ßÀý£¬»áÔÚ requirements.txt
ÎļþÖÐÁгöÏîÄ¿ËùÐèÒªµÄ°ü¡£Ã¿¸ö°üÕ¼Ò»ÐУ¬Í¨³£»¹°üº¬°æ±¾ºÅ¡£ÕâÀïÓÐÒ»¸öÀý×Ó£¬±¾²©¿ÍʹÓÃPelican£º
pelican==3.3 Markdown pelican-extended-sitemap==1.0.0 |
Python ³ÌÐò°üÓÐÒ»¸öȱÏÝÊÇ£¬ËüÃÇĬÈÏ»á½øÐÐÈ«¾Ö°²×°¡£ÎÒÃǽ«ÒªÊ¹ÓÃÒ»¸ö¹¤¾ß£¬Ê¹ÎÒÃÇÿ¸öÏîÄ¿¶¼ÓÐÒ»¸ö¶ÀÁ¢µÄ»·¾³£¬Õâ¸ö¹¤¾ß½Ðvirtualenv¡£ÎÒÃÇͬÑùÒª°²×°Ò»¸ö¸ü¸ß¼¶µÄ°ü¹ÜÀí¹¤¾ß£¬½Ð×öpip£¬Ëû¿ÉÒÔºÍvirtualenvÅäºÏ¹¤×÷¡£
Ê×ÏÈ£¬ÎÒÃÇÐèÒª°²×°pip¡£´ó¶àÊýpython°²×°³ÌÐòÒѾÄÚÖÃÁËeasy_install£¨pythonĬÈϵİü¹ÜÀí¹¤¾ß£©£¬ËùÒÔÎÒÃǾÍʹÓÃeasy_install
pipÀ´°²×°pip¡£ÕâÓ¦¸ÃÊÇÄã×îºóÒ»´ÎʹÓÃeasy_install ÁË¡£Èç¹ûÄ㲢ûÓа²×°easy_install
£¬ÔÚlinuxϵͳÖУ¬Ã²ËÆ´Ópython-setuptools °üÖпÉÒÔ»ñµÃ¡£
Èç¹ûÄãʹÓõÄPython°æ±¾¸ßÓÚµÈÓÚ3.3£¬ ÄÇôVirtualenv ÒѾÊDZê×¼¿âµÄÒ»²¿·ÖÁË£¬ËùÒÔûÓбØÒªÔÙÈ¥°²×°ËüÁË¡£
ÏÂÒ»²½£¬ÄãÏ£Íû°²×°virtualenvºÍvirtualenvwrapper¡£VirtualenvʹÄãÄܹ»ÎªÃ¿¸öÏîÄ¿´´ÔìÒ»¸ö¶ÀÁ¢µÄ»·¾³¡£ÓÈÆäÊǵ±ÄãµÄ²»Í¬ÏîĿʹÓò»Í¬°æ±¾µÄ°üʱ£¬ÕâÒ»µãÌØ±ðÓÐÓá£Virtualenv
wrapper ÌṩÁËһЩ²»´íµÄ½Å±¾£¬¿ÉÒÔÈÃһЩÊÂÇé±äµÃÈÝÒס£
sudo pip install virtualenvwrapper |
µ±virtualenvwrapper°²×°ºó£¬Ëü»á°ÑvirtualenvÁÐΪÒÀÀµ°ü£¬ËùÒÔ»á×Ô¶¯°²×°¡£
´ò¿ªÒ»¸öеÄshell£¬ÊäÈëmkvirtualenv test ¡£Èç¹ûÄã´ò¿ªÁíÍâÒ»¸öshell£¬ÔòÄã¾Í²»ÔÚÕâ¸övirtualenvÖÐÁË£¬Äã¿ÉÒÔͨ¹ýworkon
test À´Æô¶¯¡£Èç¹ûÄãµÄ¹¤×÷Íê³ÉÁË£¬¿ÉÒÔʹÓÃdeactivate À´Í£Óá£

IPython
IPythonÊDZê×¼Python½»»¥Ê½µÄ±à³Ì»·¾³µÄÒ»¸öÌæ´úÆ·£¬Ö§³Ö×Ô¶¯²¹È«£¬Îĵµ¿ìËÙ·ÃÎÊ£¬ÒÔ¼°±ê×¼½»»¥Ê½±à³Ì»·¾³±¾Ó¦¸Ã¾ß±¸µÄºÜ¶àÆäËû¹¦ÄÜ¡£
µ±Äã´¦ÔÚÒ»¸öÐéÄâ»·¾³ÖеÄʱºò£¬¿ÉÒԺܼòµ¥µÄʹÓÃpip install ipython
À´½øÐа²×°£¬ÔÚÃüÁîÐÐÖÐʹÓÃipython À´Æô¶¯

ÁíÒ»¸ö²»´íµÄ¹¦ÄÜÊÇ¡±±Ê¼Ç±¾¡±£¬Õâ¸ö¹¦ÄÜÐèÒª¶îÍâµÄ×é¼þ¡£°²×°Íê³Éºó£¬Äã¿ÉÒÔʹÓÃipython
notebook£¬¶øÇÒ»áÓÐÒ»¸ö²»´íµÄÍøÒ³UI£¬Äã¿ÉÒÔ´´½¨±Ê¼Ç±¾¡£ÕâÔÚ¿ÆÑ§¼ÆËãÁìÓòºÜÁ÷ÐС£

²âÊÔ
ÎÒÍÆ¼öʹÓÃnose»òÊÇpy.test¡£ÎҴ󲿷ÖÇé¿öÏÂÓÃnose¡£ËüÃÇ»ù±¾ÉÏÊÇÀàËÆµÄ¡£ÎÒ½«½²½ânoseµÄһЩϸ½Ú¡£
ÕâÀïÓÐÒ»¸öÈËΪ´´½¨µÄ¿ÉЦµÄʹÓÃnose½øÐвâÊÔµÄÀý×Ó¡£ÔÚÒ»¸öÒÔtest_¿ªÍ·µÄÎļþÖеÄËùÓÐÒÔtest_¿ªÍ·µÄº¯Êý£¬¶¼»á±»µ÷Óãº
def test_equality(): assert True == False |
²»³öËùÁÏ£¬µ±ÔËÐÐnoseµÄʱºò£¬ÎÒÃǵIJâÊÔûÓÐͨ¹ý¡£
(test)jhaddad@jons-mac-pro ~VIRTUAL_ENV/src$ nosetests F FAIL: test_nose_example.test_equality Traceback (most recent call last): File "/Users/jhaddad/.virtualenvs/test/lib/python2.7/site-packages/nose/case.py", line 197, in runTest self.test(*self.arg) File "/Users/jhaddad/.virtualenvs/test/src/test_nose_example.py", line 3, in test_equality assert True == False AssertionError |
nose.toolsÖÐͬÑùÒ²ÓÐһЩ±ã½ÝµÄ·½·¨¿ÉÒÔµ÷ÓÃ
from nose.tools import assert_true def test_equality(): assert_true(False) |
Èç¹ûÄãÏëʹÓøü¼ÓÀàËÆJUnitµÄ·½·¨£¬Ò²ÊÇ¿ÉÒԵģº
from nose.tools import assert_true from unittest import TestCase class ExampleTest(TestCase): def setUp(self): # setUp & tearDown are both available self.blah = False def test_blah(self): self.assertTrue(self.blah) |
¿ªÊ¼²âÊÔ£º
(test)jhaddad@jons-mac-pro ~VIRTUAL_ENV/src$ nosetests F FAIL: test_blah (test_nose_example.ExampleTest) Traceback (most recent call last): File "/Users/jhaddad/.virtualenvs/test/src/test_nose_example.py", line 11, in test_blah self.assertTrue(self.blah) AssertionError: False is not true Ran 1 test in 0.003s FAILED (failures=1) |
׿ԽµÄMock¿â°üº¬ÔÚPython 3 ÖУ¬µ«ÊÇÈç¹ûÄãÔÚʹÓÃPython 2£¬¿ÉÒÔʹÓÃpypiÀ´»ñÈ¡¡£Õâ¸ö²âÊÔ½«½øÐÐÒ»¸öÔ¶³Ìµ÷Ó㬵«ÊÇÕâ´Îµ÷Óý«ºÄʱ10s¡£Õâ¸öÀý×ÓÏÔÈ»ÊÇÈËΪÄóÔìµÄ¡£ÎÒÃÇʹÓÃmockÀ´·µ»ØÑù±¾Êý¾Ý¶ø²»ÊÇÕæÕýµÄ½øÐе÷Óá£
import mock from mock import patch from time import sleep class Sweetness(object): def slow_remote_call(self): sleep(10) return "some_data" # lets pretend we get this back from our remote api call def test_long_call(): s = Sweetness() result = s.slow_remote_call() assert result == "some_data" |
µ±È»£¬ÎÒÃǵIJâÊÔÐèÒªºÜ³¤µÄʱ¼ä¡£
(test)jhaddad@jons-mac-pro ~VIRTUAL_ENV/src$ nosetests test_mock.py Ran 1 test in 10.001s OK |
Ì«ÂýÁË£¡Òò´ËÎÒÃÇ»áÎÊ×Ô¼º£¬ÎÒÃÇÔÚ²âÊÔʲô£¿ÎÒÃÇÐèÒª²âÊÔÔ¶³Ìµ÷ÓÃÊÇ·ñÓÐÓ㬻¹ÊÇÎÒÃÇÒª²âÊÔµ±ÎÒÃÇ»ñµÃÊý¾ÝºóÒª×öʲô£¿´ó¶àÊýÇé¿öÏÂÊǺóÕß¡£ÈÃÎÒÃǰÚÍÑÕâ¸öÓÞ´ÀµÄÔ¶³Ìµ÷Óðɣº
import mock from mock import patch from time import sleep class Sweetness(object): def slow_remote_call(self): sleep(10) return "some_data" # lets pretend we get this back from our remote api call def test_long_call(): s = Sweetness() with patch.object(s, "slow_remote_call", return_value="some_data"): result = s.slow_remote_call() assert result == "some_data" |
ºÃ°É£¬ÈÃÎÒÃÇÔÙÊÔÒ»´Î£º
(test)jhaddad@jons-mac-pro ~VIRTUAL_ENV/src$ nosetests test_mock.py Ran 1 test in 0.001s OK |
ºÃ¶àÁË¡£¼Çס£¬Õâ¸öÀý×Ó½øÐÐÁË»ÄÌÆµÄ¼ò»¯¡£¾ÍÎÒ¸öÈËÀ´½²£¬ÎÒ½ö½ö»áºöÂÔ´ÓÔ¶³ÌϵͳµÄµ÷Ó㬶ø²»ÊÇÎÒµÄÊý¾Ý¿âµ÷Óá£
nose-progressiveÊÇÒ»¸öºÜºÃµÄÄ£¿é£¬Ëü¿ÉÒÔ¸ÄÉÆnoseµÄÊä³ö£¬ÈôíÎóÔÚ·¢Éúʱ¾ÍÏÔʾ³öÀ´£¬¶ø²»ÊÇÁôµ½×îºó¡£Èç¹ûÄãµÄ²âÊÔÐèÒª»¨·ÑÒ»¶¨µÄʱ¼ä£¬ÄÇôÕâÊǼþºÃÊ¡£
pip install nose-progressive ²¢ÇÒÔÚÄãµÄnosetestsÖÐÌí¼Ó--with-progressive
µ÷ÊÔ
iPDBÊÇÒ»¸ö¼«ºÃµÄ¹¤¾ß£¬ÎÒÒѾÓÃËü²é³öÁ˺ܶà·ËÒÄËù˼µÄbug¡£pip
install ipdb °²×°¸Ã¹¤¾ß£¬È»ºóÔÚÄãµÄ´úÂëÖÐimport ipdb; ipdb.set_trace()£¬È»ºóÄã»áÔÚÄãµÄ³ÌÐòÔËÐÐʱ£¬»ñµÃÒ»¸öºÜºÃµÄ½»»¥Ê½Ìáʾ¡£Ëüÿ´ÎÖ´ÐгÌÐòµÄÒ»Ðв¢ÇÒ¼ì²é±äÁ¿¡£

pythonÄÚÖÃÁËÒ»¸öºÜºÃµÄ×·×ÙÄ£¿é£¬°ïÖúÎÒ¸ãÇå³þ·¢ÉúÁËʲô¡£ÕâÀïÓÐÒ»¸öûʲôÓõÄpython³ÌÐò£º
ÕâÀïÊǶÔÕâ¸ö³ÌÐòµÄ×·×Ù½á¹û£º
(test)jhaddad@jons-mac-pro ~VIRTUAL_ENV/src$ python -m trace --trace tracing.py --- modulename: tracing, funcname: <module> tracing.py(1): a = 1 tracing.py(2): b = 2 tracing.py(3): a = b --- modulename: trace, funcname: _unsettrace trace.py(80): sys.settrace(None) |
µ±ÄãÏëÒª¸ãÇå³þÆäËû³ÌÐòµÄÄÚ²¿¹¹ÔìµÄʱºò£¬Õâ¸ö¹¦Äܷdz£ÓÐÓá£Èç¹ûÄãÒÔǰÓùýstrace£¬ËüÃǵŤ×÷·½Ê½ºÜÏàÏñ
ÔÚһЩ³¡ºÏ£¬ÎÒʹÓÃpycallgraphÀ´×·×ÙÐÔÄÜÎÊÌâ¡£Ëü¿ÉÒÔ´´½¨º¯Êýµ÷ÓÃʱ¼äºÍ´ÎÊýµÄͼ±í¡£

×îºó£¬objgraph¶ÔÓÚ²éÕÒÄÚ´æÐ¹Â¶·Ç³£ÓÐÓá£ÕâÀïÓÐһƪ¹ØÓÚÈçºÎʹÓÃËü²éÕÒÄÚ´æÐ¹Â¶µÄºÃÎÄ¡£
Gevent
Gevent ÊÇÒ»¸öºÜºÃµÄ¿â£¬·â×°ÁËGreenlets£¬Ê¹µÃPython¾ß±¸ÁËÒì²½µ÷ÓõŦÄÜ¡£Êǵģ¬·Ç³£°ô¡£ÎÒ×î°®µÄ¹¦ÄÜÊÇPool£¬Ëü³éÏóÁËÒì²½µ÷Óò¿·Ö£¬¸øÎÒÃÇÌṩÁË¿ÉÒÔ¼òµ¥Ê¹ÓõÄ;¾¶£¬Ò»¸öÒì²½µÄmap()º¯Êý£º
from gevent import monkey monkey.patch_all() from time import sleep, time def fetch_url(url): print "Fetching %s" % url sleep(10) print "Done fetching %s" % url from gevent.pool import Pool urls = ["http://test.com", "http://bacon.com", "http://eggs.com"] p = Pool(10) start = time() p.map(fetch_url, urls) print time() - start |
·Ç³£ÖØÒªµÄÊÇ£¬ÐèҪעÒâÕâ¶Î´úÂë¶¥²¿¶Ôgevent monkey½øÐеIJ¹¶¡£¬Èç¹ûûÓÐËüµÄ»°£¬¾Í²»ÄÜÕýÈ·µÄÔËÐС£Èç¹ûÎÒÃÇÈÃPythonÁ¬Ðøµ÷ÓÃ
fetch_url 3´Î£¬Í¨³£ÎÒÃÇÆÚÍûÕâ¸ö¹ý³Ì»¨·Ñ30Ãëʱ¼ä¡£Ê¹ÓÃgevent£º
(test)jhaddad@jons-mac-pro ~VIRTUAL_ENV/src$ python g.py Fetching http://test.com Fetching http://bacon.com Fetching http://eggs.com Done fetching http://test.com Done fetching http://bacon.com Done fetching http://eggs.com 10.001791954 |
Èç¹ûÄãÓкܶàÊý¾Ý¿âµ÷ÓûòÊÇ´ÓÔ¶³ÌURLs»ñÈ¡£¬ÕâÊǷdz£ÓÐÓõġ£ÎÒ²¢²»ÊǺÜϲ»¶»Øµ÷º¯Êý£¬ËùÒÔÕâÒ»³éÏó¶ÔÎÒÀ´ËµÐ§¹ûºÜºÃ¡£
½áÂÛ
ºÃ°É£¬Èç¹ûÄã¿´µ½ÕâÀïÁË£¬ÄÇôÄãºÜ¿ÉÄÜÒѾѧµ½ÁËһЩж«Î÷¡£ÕâЩ¹¤¾ß£¬ÔÚ¹ýÈ¥µÄÒ»ÄêÀï¶ÔÎÒÓ°ÏìÖØ´ó¡£ÕÒ´òËüÃÇ»¨·ÑÁ˲»ÉÙʱ¼ä£¬ËùÒÔÏ£Íû±¾ÎÄÄܹ»¼õÉÙÆäËûÈËÏëÒªºÜºÃÀûÓÃÕâÃÅÓïÑÔÐèÒª¸¶³öµÄŬÁ¦¡£
|