Ĉapitro 15 - Subtenante Tempo, Scheduling Taskoj kaj Ĵeto Programoj
Subtenu la Aŭtoro: Aĉeti la libron sur Amazono aŭ
la libro / ebook pakaĵo rekte Neniu amelo Gazetaro .
Legi la aŭtora aliaj liberaj Python libroj:
Tenanta Tempo, Scheduling Taskoj kaj Ĵeto Programoj
Kuranta programojn dum vi sidas ĉe via komputilo estas bona, sed ĝi
estas ankaŭ utila havi programoj kuri sen via rekta superrigardo. Via komputila horloĝo povas lanĉi programojn kodon en iu specifa tempo kaj dato aŭ je regulaj intervaloj. Ekzemple, via programo povis skrapi retejon ĉiuhore por kontroli ŝanĝojn aŭ fari CPU-intensa tasko ĉe 4 AM dum vi dormas. Python
time
kaj datetime
moduloj provizas tiujn funkciojn.
Vi povas ankaŭ skribi programojn kiuj lanĉi aliajn programojn sur horaro uzante la
subprocess
kaj threading
moduloj. Ofte, la plej rapida vojo por programo estas utiligi aplikoj kiuj aliaj personoj jam skribita. La tempo Modulo
Via komputilo sistemo horloĝo estas metita al specifa dato, tempo kaj horzono. La konstruita-en
time
modulo permesas via Python programoj por legi la sistemo horloĝo por la nuna tempo. La time.time()
kaj time.sleep()
funkcioj estas la plej utila en la time
modulo. La time.time () Funkcio
La Unix epoko estas tempo referenco komune uzita en programado: 12 atm sur Januaro 1, 1970, Kunordigita Universala Tempo (UTC). La
time.time()
redonas la nombron de sekundoj ekde tiu momento kiel float valoro. (Memoru ke kaleŝego estas nur nombro kun dekuma punkto.) Tiu nombro estas nomita epoko tempstampo. Ekzemple, tajpu la sekvajn en la interaga konko: >>> Import tempo >>> Time.time () 1425063955,068649
Tie mi vokas
time.time()
sur Februaro 27, 2015, je 11:05 Pacifiko Norma Tempo, aŭ 7:05 PM UTC. La reveno valoro estas kiom da sekundoj jam pasis inter la Uniksa epoko kaj la momento time.time()
nomiĝis. noto
La
interaga ŝelo ekzemploj donados datoj kaj tempoj por kiam mi skribis
tiun ĉapitron en februaro 2015. Se vi estas tempo vojaĝanto, via datoj
kaj tempoj estos malsamaj.
Epoko timestamps povas kutimi profilo kodo, te, mezuri kiom longe koderon prenas kuri. Se vi nomas
time.time()
komence de la kodo bloko volas mezuri kaj denove ĉe la fino, vi povas
subtrahi la unua tempstampo de la dua trovi la Pasinta tempo inter tiuj
du alvokoj. Ekzemple, malfermi novan dosieron redaktanto fenestro kaj eniri la sekvan programon: importado tempo ❶ def calcProd (): # Kalkuli la produkto de la unuaj 100.000 numerojn. produkto = 1 por i en gamo (1, 100000): produkto = produkto * i reveno produkto ❷ startTime = time.time () prod = calcProd () ❸ Endtime = time.time () ❹ print ( 'La rezulto estas% s ciferoj longa.'% (Len (str (prod)))) ❺ print ( 'Prenis% s sekundojn kalkuli.'% (Endtime - startTime))
Ĉe ❶, ni difini funkcion
calcProd()
por buklo tra la entjeroj de 1 al 99.999 kaj reveni ilia produkto. Ĉe ❷ ni nomas time.time()
kaj stoki ĝin en startTime
. Dekstra post nomi calcProd()
, ni nomas time.time()
denove kaj gardi ĝin en endTime
❸. Ni finas per presi la longeco de la produkto revenis por calcProd()
❹ kaj kiom longe ĝi prenis kuri calcProd()
❺.
Savi tiun programon kiel calcProd.py kaj ruli ĝin. La eligo aspektos ion kiel jene:
La rezulto estas 456569 ciferoj longa. Prenis 2,844162940979004 sekundojn kalkuli.
noto
Alia maniero profilo via kodo estas uzi la
cProfile.run()
funkcio, kiu provizas multe pli informa nivelo de detalo ol la simpla time.time()
tekniko. La cProfile.run()
funkcio estas klarigita ĉe https://docs.python.org/3/library/profile.html . La time.sleep () Funkcio
Se vi bezonas paŭzi vian programon por momento, invitu
time.sleep()
funkcio kaj pasi ĝin la nombro da sekundoj vi volas vian programon resti paŭzis. Eniri la sekva en la interaga konko: >>> Import tempo >>> Por i en gamo (3): ❶ print ( 'Tick') ❷ time.sleep (1) ❸ print ( 'Tock') ❹ time.sleep (1) tick tock tick tock tick tock ❺ >>> time.sleep (5)
La
for
buklo presos Tick
❶, paŭzi por dua ❷, presi Tock
❸, paŭzi por dua ❹, presi Tick
, paŭzo, kaj tiel plu ĝis Tick
kaj Tock
jam ĉiu estis presita tri fojojn.
La
time.sleep()
funkcio blokos Ke estas, ĝi ne revenos kaj liberigi vian programon ekzekuti aliajn kodo-ĝis post la nombro da sekundoj vi pasis al time.sleep()
pasis. Ekzemple, se vi eniras time.sleep(5)
❺, vi vidos ke la sekva prompto ( >>>
) ne aperis ĝis kvin sekundoj pasis.
Atentu ke premante CTRL -C ne interrompi
time.sleep()
alvokas en sencela. Sencela atendas ĝis la tuta paŭzo estas finita antaŭ proponi la KeyboardInterrupt
escepto. Labori ĉirkaŭ tiu problemo, anstataŭe de havado de ununura time.sleep(30)
nomas paŭzi dum 30 sekundoj, uzu for
buklo fari 30 alvokoj al time.sleep(1)
. >>> Por i en gamo (30): time.sleep (1)
Se vi premas CTRL -C iam dum tiuj 30 sekundoj, vi vidos la
KeyboardInterrupt
escepto ĵetitaj tuj. rondigas Nombroj
Kiam laborante kun tempoj, vi ofte renkontas kaleŝego valoroj kun multaj ciferoj post la dekuma. Fari tiujn valorojn facila labori kun, Vi povas mallongigi ilin per Python korpigita
round()
funkcio, kiu preterpasas kaleŝego al la precizeco vi specifas.
Nur pasas en la nombro vi volas rondigi, pli laŭvola dua argumento
reprezentanta kiom da ciferoj post la dekuma punkto vi volas rondigi
ĝin. Se vi preterlasas la dua argumento, round()
preterpasas vian numeron al la plej proksima tuta entjero. Eniri la sekva en la interaga konko: >>> Import tempo >>> Nun = time.time () >>> nun 1425064108,017826 >>> Raŭndo (nun, 2) 1425064108,02 >>> Raŭndo (nun 4) 1425064108.0178 >>> Raŭndo (nun) 1425064108
Post importanta
time
kaj stokante time.time()
en now
, ni nomas round(now, 2)
rondigi now
du ciferoj post la dekuma, round(now, 4)
por rondigi al kvar ciferoj post la dekuma, kaj round(now)
por rondigi al la plej proksima entjero. Projekto: Super Stopwatch
Diru vi deziras spuri kiom da tempo vi elspezas en enuigaj taskoj vi ne aŭtomatigitaj ankoraŭ.
Vi ne havas fizikan cronómetro, kaj estas surprize malfacile trovi
liberaj cronómetro app por via portebla aŭ smartphone kiu ne estas
kovrita en anoncoj kaj ne sendu kopion de via retumilo historio
marketers.
(Ĝi diras ke ĝi povas fari tion en la licencon interkonsento vi
konsentis. Vi legu la permesilo, ĉu ne?) Vi povas skribi simplan
cronómetro programo mem en Python.
Je alta nivelo, jen kion via programo faros:
- Spuri la kvanto de tempo pasis inter gazetaroj de la ENENklavon ŝlosilo, kun ĉiu klavo gazetaro komencas novan "lap" en la temporizador.
- Presi la rondiro nombro, tuta tempo, kaj genuoj tempo.Tio signifas via kodo devos fari la sekvan:
- Trovi la nuna tempo nomante
time.time()
kaj stoki ĝin kiel tempindiko je la komenco de la programo, tiel kiel al la komenco de ĉiu rondiro. - Konservu rondiro vendotablo kaj pliigo ĝin ĉiufoje kiam la uzanto premas ENTER.
- Kalkuli la pasis tempon per subtrahanta timestamps.
- Manipuli la
KeyboardInterrupt
escepto tiel la uzanto povas premi CTRL -C esi.
Malfermi novan dosieron redaktanto fenestro kaj savi ĝin kiel stopwatch.py.
Paŝo 1: Ŝanĝu Supren la Programo Spuri Tempoj
La cronómetro programo bezonos uzi la nunan tempon, Do vi volas importi la
time
modulo. Via programo ankaŭ devus presi iujn mallongajn instrukciojn al la uzanto antaŭ nomante input()
, tiel la temporizador povas komenci post la uzanto premas ENTER. Tiam la kodo komencos sekvado rondirtempojn.
Eniri la sekvan kodon en la dosiero redaktoro, skribante
TODO
komenton kiel lokokupilon por la resto de la kodo #! python3 # Stopwatch.py - Simpla cronómetro programo. importado tempo # Montru la programo instrukcioj. print ( 'Premu ENTER por komenci. Poste, premu la ENENklavon por "klaki" la cronómetro. Premu Stir-C esi. ') enigo () # gazetaro Eniri komenci print ( 'Komencita.') startTime = time.time () # atingi la unuan etapon de la komenctempo lastTime = startTime lapNum = 1 # TODO: Komenci spuras la rondiro fojojn.
Nun ke ni skribis la kodon por montri la instrukcioj, komencu la unua
rondiro, noti la tempon, kaj metis niajn genuojn grafo al 1.
Paŝo 2: Trako kaj Print Lap Tempoj
Nun ni skribu la kodon por komenci ĉiun novan etapon, kalkuli kiom
longe la antaŭaj genuoj prenis kaj kalkuli la tuta tempo pasis ekde
komencanta la cronómetro. Ni montros la rondirtempon kaj tuta tempo kaj pliigi la rondiro grafo por ĉiu nova rondiro. Aldonu la sekvan kodon al via programo:
#! python3 # Stopwatch.py - Simpla cronómetro programo. importado tempo --snip-- # Start spuras la rondiro fojojn. ❶ provi: ❷ dum Vera: enigo () ❸ lapTime = ronda (time.time () - lastTime, 2) ❹ totalTime = ronda (time.time () - startTime, 2) ❺ print ( 'Lap #% s:% s (% s)'% (lapNum, totalTime, lapTime), fino = '') lapNum + = 1 lastTime = time.time () # reagordi la lasta rondveturo tempo ❻ krom KeyboardInterrupt: # Handle la Stir-C escepto teni lian erarmesaĝo de montranta. print ( '\ nDone.')
Se la uzanto premas CTRL -C halti la cronómetro, la
KeyboardInterrupt
escepto estos levita, kaj la programo frakasos se lia ekzekuto ne estas try
komunikaĵo. Malhelpi frakasante, ni envolver tiu parto de la programo en try
komunikaĵo ❶. Ni manipuli la escepto en la except
klaŭzo ❻, do kiam CTRL -C estas premita kaj la escepto estas levita, la programo ekzekuto movas al la kodogrupo except presi Done
, anstataŭ la KeyboardInterrupt
erarmesaĝon. Ĝis ĉi tio okazas, la ekzekuto estas ene senfina ciklo ❷ kiu nomas input()
kaj atendas ĝis la uzanto premas ENTER fini rondiro. Kiam rondiro finiĝas, ni kalkulas kiom longe la sinon prenis per subtrahanta la komenco tempo de la rondiro, lastTime
, el la nuna tempo, time.time()
❸. Ni kalkulas la tuta tempo pasis per subtrahanta la entuta komenctempo de la cronómetro, startTime
, de la nuna tempo ❹.
Ekde la rezultoj de ĉi tiuj tempo kalkuloj havos multaj ciferoj post la dekuma punkto (kiel
4.766272783279419
), ni uzas la round()
funkcion por rondigi la kaleŝego valoron al du ciferoj ĉe ❸ kaj ❹.
Ĉe ❺, ni presi la rondiro nombro, tuta tempo pasis, kaj la genuoj tempo. Ekde la uzanto premante ENTER por la
input()
alvoko presos novan linion al la ekrano, pasi end=''
al la print()
funkcion por eviti duoblan Interspacigo la eligo. Post presi la rondiro informo, ni akiras pretan por la venonta rondiro aldonante 1 al la grafo lapNum
kaj opcio lastTime
al la nuna tempo, kiu estas la komenco tempo de la venonta rondiro. Ideoj por Similaj Programoj
Tempo sekvado malfermas plurajn eblecojn por viaj programoj.
Kvankam vi povas elŝuti apps fari kelkajn el tiuj aferoj, la profito de
skribo programoj mem estas ke ili estos liberaj kaj ne ŝvela kun
anoncoj kaj senutila karakterizaĵoj. Vi povus skribi similajn programojn por fari la sekvajn:
- Krei simplan timesheet app kiu gravuras kiam vi tajpas la nomon de persono kaj uzas la nunan tempon por horloĝo ilin en aŭ ekstere.
- Aldoni karakterizaĵon al via programo por montri la pasis tempon ekde procezo komenciĝis, kiel malŝarĝo kiu uzas la
requests
modulo. (Vidu Ĉapitro 11 .) - Intermite kontrolu kiom longe programo estis kurante kaj proponi al la uzanto ŝancon nuligi taskoj kiuj prenas tro longa.
La DatoTempo Modulo
La
time
modulo estas utila por akiranta Unikso epoko tempstampo labori kun.
Sed se vi volas montri daton en pli oportuna formato, aŭ kalkuli kun
datoj (ekzemple, decidi kio nun estis 205 tagoj aŭ kio nun estas 123
tagoj de nun), vi devus uzi la datetime
modulo.
La
datetime
modulo havas sian propran datetime
datumtipo. datetime
valoroj reprezentas specifan momenton en tempo. Eniri la sekva en la interaga konko: >>> Import DatoTempo ❶ >>> datetime.datetime.now () ❷ datetime.datetime (2015, 2, 27, 11, 10, 49, 55, 53) ❸ >>> dt = datetime.datetime (2015, 10, 21, 16, 29, 0) ❹ >>> dt.year, dt.month, dt.day (2015, 10, 21) ❺ >>> dt.hour, dt.minute, dt.second (16, 29, 0)
Nomante
datetime.datetime.now()
❶ redonas datetime
objekto ❷ por la aktuala dato kaj tempo, laŭ via komputila horloĝo. Tiu celo inkludas la jaro, monato, tago, horo, minuto, dua, kaj microsegundos de la nuna momento. Vi povas ankaŭ elsxuti datetime
objekto por specifa momento uzante la datetime.datetime()
funkcio ❸, pasante ĝin entjeroj reprezentanta la jaro, monato, tago, horo, kaj dua de la momento vi volas. Tiuj entjeroj estos stokitaj en la datetime
objekto year
, month
, day
❹, hour
, minute
kaj second
❺ atributoj.
A Unikso epoko tempstampo povas esti konvertita al
datetime
objekto kun la datetime.datetime.fromtimestamp()
funkcio. La dato kaj tempo de la datetime
objekto estos konvertita por la loka horzono. Eniri la sekva en la interaga konko: >>> Datetime.datetime.fromtimestamp (1000000) datetime.datetime (1970, 1, 12, 5, 46, 40) >>> Datetime.datetime.fromtimestamp (time.time ()) datetime.datetime (2015, 2, 27, 11, 13, 0, 604980)
Nomante
datetime.datetime.fromtimestamp()
kaj pasante ĝin 1000000
revenas al datetime
objekto momente 1,000,000 sekundoj post la Uniksa epoko. Pasante time.time()
, la Unikso epoko tempstampo por la nuna momento, redonas datetime
objekto por la nuna momento. Do la esprimoj datetime.datetime.now()
kaj datetime.datetime.fromtimestamp(time.time())
faras la samon; Ili ambaŭ donas vin datetime
objekto por la nuna momento. noto
Tiuj ekzemploj estis eniris en komputilo aro al Pacifiko Norma Tempo. Se vi estas en alia tempozono, viajn rezultojn aspektos malsamaj.
datetime
objektoj povas esti komparita kun la alia uzante komparo operatoroj eltrovi kiun el antaŭiras la aliaj. La postaj datetime
objekto estas la "pli granda" valoro. Eniri la sekva en la interaga konko: ❶ >>> halloween2015 = datetime.datetime (2015, 10, 31, 0, 0, 0) ❷ >>> newyears2016 = datetime.datetime (2016, 1, 1, 0, 0, 0) >>> Oct31_2015 = datetime.datetime (2015, 10, 31, 0, 0, 0) ❸ >>> halloween2015 == oct31_2015 veraj ❹ >>> halloween2015> newyears2016 falsa ❺ >>> newyears2016> halloween2015 veraj >>> Newyears2016! = Oct31_2015 veraj
Fari
datetime
objekto por la unua momento (noktomezo) de oktobro 31, 2015 kaj stoki ĝin en halloween2015
❶. Fari datetime
objekto por la unua momento de januaro 1, 2016 kaj stoki ĝin en newyears2016
❷. Tiam fari alian celon por noktomezo sur Oktobro 31, 2015 kaj stoki ĝin en oct31_2015
. Komparante halloween2015
kaj oct31_2015
montras ke ili estas egalaj ❸. Komparante newyears2016 kaj halloween2015 montras ke newyears2016
estas pli granda (poste) ol halloween2015
❹ ❺. La timedelta Datumoj Tipo
La
datetime
modulo ankaŭ provizas timedelta
datumtipo, kiu reprezentas daŭro de tempo prefere ol momenton en tempo. Eniri la sekva en la interaga konko: ❶ >>> delta = datetime.timedelta (tagoj = 11 horoj = 10 minutoj = 9 sekundoj = 8) ❷ >>> delta.days, delta.seconds, delta.microseconds (11, 36548, 0) >>> Delta.total_seconds () 986948,0 >>> Str (delta) '11 Tagoj, 10:09:08 '
Krei
timedelta
objekto, uzi la datetime.timedelta()
funkcio. La datetime.timedelta()
funkcio prenas ŝlosilvorto argumentoj weeks
, days
, hours
, minutes
, seconds
, milliseconds
kaj microseconds
. Ekzistas neniu month
aŭ year
ŝlosilvorto argumento ĉar "monato" aŭ "jaro" estas variablo kvanton de tempo dependanta sur la aparta monato aŭ jaro. A timedelta
objekto havas la tuta daŭro reprezentitaj en tagoj, sekundoj, kaj mikrosekundoj. Tiuj nombroj estas stokitaj en la days
, seconds
, kaj microseconds
atributoj respektive. La total_seconds()
metodo revenos la daŭro en kelkaj sekundoj sola. Pasante timedelta
objekto al str()
revenos bele formatita, facile legebla string reprezento de la objekto.
En ĉi tiu ekzemplo, ni pasas ŝlosilvorto argumentoj
datetime.delta()
specifi daŭron de 11 tagoj, 10 horoj, 9 minutoj kaj 8 duaj, kaj stoki la reiris timedelta
objekto en delta
❶. Ĉi timedelta
objekto days
atributoj tendencas 11
, kaj lia seconds
atribui tendencas 36548
(10 horoj, 9 minutoj kaj 8 duaj, esprimita en sekundoj) ❷. Nomante total_seconds()
diras al ni, ke 11 tagoj, 10 horoj, 9 minutoj kaj 8 sekundoj estas 986.948 sekundoj. Fine, pasante la timedelta
objekto al str()
redonas kordoj klare explaning la daŭron.
La aritmetikaj operatoroj povas esti uzata por prezenti daton aritmetiko sur
datetime
valoroj. Ekzemple, kalkuli la daton 1000 tagoj de nun, tajpu la sekvajn en la interaga konko: >>> Dt = datetime.datetime.now () >>> dt datetime.datetime (2015, 2, 27, 18, 38, 50, 636181) >>> ThousandDays = datetime.timedelta (tagoj = 1000) >>> Dt + thousandDays datetime.datetime (2017, 11, 23, 18, 38, 50, 636181)
Unue fari
datetime
objekto por la nuna momento kaj stoki ĝin en dt
. Tiam fari timedelta
objekto por daŭro de 1,000 tagoj kaj stoki ĝin en thousandDays
. Aldoni dt
kaj thousandDays
kune akiri datetime
objekto por la dato 1,000 tagoj.
Python faros la dato aritmetikaj elkompreni ke 1,000 tagoj post
februaro 27, 2015, estos Novembro 23, 2017. Tiu estas utila ĉar kiam vi
kalkuli 1,000 tagoj de donita dato, vi devas memori kiom da tagoj estas
en ĉiu monato kaj faktoro en superjaroj kaj aliaj delikataj detaloj. La datetime
modulo manipulas ĉio ĉi por vi. timedelta
objektoj povas esti aldonita aŭ subtrahita kun datetime
celoj aŭ aliaj timedelta
objektoj uzante la +
kaj -
operatoroj. A timedelta
objekto povas esti multiplikitaj aŭ dividitaj per entjero aŭ flosi valoroj kun la *
kaj /
operatoroj. Eniri la sekva en la interaga konko: ❶ >>> oct21st = datetime.datetime (2015, 10, 21, 16, 29, 0) ❷ >>> aboutThirtyYears = datetime.timedelta (tagoj = 365 * 30) >>> oct21st datetime.datetime (2015, 10, 21, 16, 29) >>> Oct21st - aboutThirtyYears datetime.datetime (1985, 10, 28, 16, 29) >>> Oct21st - (2 * aboutThirtyYears) datetime.datetime (1955, 11, 5, 16, 29)
Tie ni faras
datetime
objekto por Oktobro 21, 2015 ❶ kaj timedelta
objekto por daŭro de ĉirkaŭ 30 jaroj (ni supozante 365 tagoj por ĉiu de tiuj jaroj) ❷. Subtrahanta aboutThirtyYears
de oct21st
donas ni datetime
objekto por la dato 30 jarojn antaŭ oktobro 21, 2015. subtrahanta 2 * aboutThirtyYears
de oct21st
redonas datetime
objekto por la dato 60 jarojn antaŭ oktobro 21, 2015. Paŭzante Ĝis Specifaj Dato
La
time.sleep()
metodo permesas paŭzi programon por certa nombro da sekundoj. Uzante while
buklo, vi povas paŭzi vian programojn ĝis specifa dato. Ekzemple, la sekvanta kodo daŭre buklo ĝis Halloween 2016: importado DatoTempo importado tempo halloween2016 = datetime.datetime (2016, 10, 31, 0, 0, 0) dum datetime.datetime.now () <halloween2016: time.sleep (1)
La
time.sleep(1)
alvoko estos paŭzi vian Python programo por ke la komputilo ne malŝparu
CPU prilaborado cikloj simple kontrolanta la tempon denove kaj denove. Prefere, la while
buklo nur kontroli la kondiĉo iam sekunde kaj daŭrigi kun la resto de
la programo post Halloween 2016 (aŭ whenever vi plani ŝin halti). Konvertado DatoTempo Objektoj en Ĉenoj
Epoko timestamps kaj
datetime
celoj ne tre amika al la homa okulo. Uzi la strftime()
metodon por montri datetime
objekto kiel linio. (La f en la nomo de la strftime()
funkcio signifas formato.)
La
strftime()
metodo uzas direktivojn simila al Python ŝnuro strukturado. Tabelo 15-1 havas plenan liston de strftime()
direktivojn.
Tabelo 15-1.
strftime()
Direktivoj
strftime direktivo
|
signifanta
|
---|---|
%Y |
Jaro kun jarcento, kiel en
'2014' |
%y |
Jaro sen jarcento,
'00' al '99' (1970 al 2069) |
%m |
Monato kiel du ciferoj,
'01' al '12' |
%B |
Plena monatnomo, kiel en
'November' |
%b |
Mallongigita monatnomo, kiel en
'Nov' |
%d |
Tago de la monato,
'01' al '31' |
%j |
Tago de la jaro,
'001' por '366' |
%w |
Tago de la semajno,
'0' (dimanĉo) por '6' (sabato) |
%A |
Plena nomo, kiel en
'Monday' |
%a |
Mallongigita nomo de la semajntago, kiel en
'Mon' |
%H |
Horo (24-hora horloĝo),
'00' al '23' |
%I |
Horo (12-hora horloĝo),
'01' al '12' |
%M |
Minuto,
'00' al '59' |
%S |
Dua,
'00' al '59' |
%p | 'AM' aŭ 'PM' |
%% |
Laŭvorta
'%' karaktero |
Pasi
strrftime()
kutimo formato ĉeno enhavante formatado direktivojn (kune kun ajna dezirata balteoj, dupunktoj, ktp), kaj strftime()
redonos la datetime
objekto informo kiel formatan kordoj. Eniri la sekva en la interaga konko: >>> Oct21st = datetime.datetime (2015, 10, 21, 16, 29, 0) >>> Oct21st.strftime ( '% Y /% m /% d% H:% M:% S') '2015/10/21 16:29:00' >>> Oct21st.strftime ( '% mi:% M% p) '04: 29 ptm ' >>> Oct21st.strftime ( "% B de '% y") "Oktobro de '15"
Tie ni havas
datetime
objekto por Oktobro 21, 2015 ĉe 4:29 ptm, stokitaj en oct21st
. Pasante strftime()
la kutimo formato string '%Y/%m/%d %H:%M:%S'
redonas ĉeno enhavante 2015, 10, kaj 21 apartaj por slahes kaj 16, 29 kaj 00, apartigante per dupunktoj. Pasante '%I:%M% p'
revenas '04:29 PM'
kaj pasi "%B of '%y"
revenas "October of '15"
. Notu ke strftime()
ne komencas kun datetime.datetime
. Konvertado Strings en DatoTempo Objektoj
Se vi havas ĉenon de dato informoj, kiel
'2015/10/21 16:29:00'
aŭ 'October 21, 2015'
, kaj devas konverti ĝin al datetime
objekto, uzi la datetime.datetime.strptime()
funkcio. La strptime()
funkcio estas la inverso de la strftime()
metodo. Kutimo formato string uzante la samaj gvidlinioj kiujn strftime()
devas esti pasita por ke strptime()
scipovas analizi kaj kompreni la kordo. (La p en la nomo de la strptime()
funkcio signifas parse.)
Eniri la sekva en la interaga konko:
❶ >>> datetime.datetime.strptime ( 'Oktobro 21, 2015', '% B% d,% Y') datetime.datetime (2015, 10, 21, 0, 0) >>> Datetime.datetime.strptime ( '2015/10/21 16:29:00', '% Y /% m /% d% H:% M:% S') datetime.datetime (2015, 10, 21, 16, 29) >>> Datetime.datetime.strptime ( "oktobro '15", "% B de '% y") datetime.datetime (2015, 10, 1, 0, 0) >>> Datetime.datetime.strptime ( "novembro '63", "% B de '% y") datetime.datetime (2063, 11, 1, 0, 0)
Akiri
datetime
objekto de la kordo 'October 21, 2015'
, pasi 'October 21, 2015'
kiel la unua argumento al strptime()
kaj la kutimo formato string kiu respondas al 'October 21, 2015'
kiel la dua argumento ❶. La ŝnuro kun la daton informo devas parigi la kutimo formato string ĝuste, aŭ Python levos ValueError
escepto. Revizio de Python Tempo Funkcioj
Datoj kaj tempoj en Python povas impliki tre kelkajn malsamajn datumtipoj kaj funkcioj. Jen resumo de la tri malsamaj tipoj de valoroj uzataj por reprezenti tempo:
- A Unikso epoko tempstampo (uzita de la
time
modulo) estas kaleŝego aŭ entjera valoro de la nombro de sekundoj ekde 12 atm sur Januaro 1, 1970, UTC. - A
datetime
objekto (de ladatetime
modulo) havas entjeroj stokitaj en la atributojyear
,month
,day
,hour
,minute
kajsecond
. - A
timedelta
objekto (de ladatetime
modulo) reprezentas tempon daŭro, prefere ol specifa momento.
Jen resumo de tempo funkcioj kaj iliaj parametroj kaj reveno valoroj:
- La
time.time()
redonas epoko tempstampo kaleŝego valoron de la nuna momento. - La
time.sleep(
seconds
)
funkcio ĉesas la programo por la kvanto de sekundoj specifita de laseconds
argumento. - La
datetime.datetime(
year
,month
,day
,hour
,minute
,second
)
funkcio redonasdatetime
objekto de la momento specifita de la argumentoj. Sehour
,minute
, aŭsecond
argumentoj estas ne provizita, ili default al0
. - La
datetime.datetime.now()
funkcio redonasdatetime
objekto de la nuna momento. - La
datetime.datetime.fromtimestamp(
epoch
)
funkcio redonasdatetime
objekto de la momento reprezentita de laepoch
tempstampo argumento. - La
datetime.timedelta(
weeks
,days
,hours
,minutes
,seconds
,milliseconds
,microseconds
)
funkcio redonastimedelta
objekto reprezentante daŭro de tempo. La funkcia ŝlosilvorto argumentoj estas ĉiuj laŭvolaj kaj ne inkludasmonth
aŭyear
. - La
total_seconds()
metodo portimedelta
objektoj redonas la nombron da sekundoj latimedelta
objekto reprezentas. - La
strftime(
format
)
metodo revenas cxeno de la tempo reprezentita de ladatetime
objekto en kutimo formato kiu estas bazita sur laformat
kordoj. Vidu Tabelo 15-1 por la formato detaloj. - La
datetime.datetime.strptime(
time_string
,format
)
funkcio redonasdatetime
objekto de la momento specifita detime_string
, analizitajn uzante laformat
string argumento. Vidu Tabelo 15-1 por la formato detaloj.
multithreading
Enkonduki la koncepton de multithreading, ni rigardu ekzemplon situacion. Diru vi volas plani iun kodon kuri post prokrasto aŭ ĉe specifa tempo. Vi povus aldoni kodon kiel la jenaj ĉe la komenco de via programo:
importado tempo, DatoTempo startTime = datetime.datetime (2029, 10, 31, 0, 0, 0) dum datetime.datetime.now () <startTime: time.sleep (1) print ( 'Programo nun komencante sur Halloween 2029) --snip--
Tiu kodo designa komenctempo de oktobro 31, 2029, kaj tenas nomante
time.sleep(1)
ĝis la komenco tempo alvenas. Via programo povas fari nenion dum atendanta por la buklo de time.sleep()
nomas fini; ĝi nur sidas ĉirkaŭe ĝis Halloween 2029. Tiu estas ĉar Pitono programoj defaŭlte havas sola fadeno de ekzekuto.
Kompreni kion fadenon de ekzekuto estas, memoru la Ĉapitro 2
diskuto de fluo kontrolo, kiam vi imagis la ekzekuto de programo kiel
metante vian fingron sur linio de kodo en via programo kaj movante al la
sekva linio aŭ kie ajn ĝi estis sendita de fluo kontrolo komunikaĵo. Ununura-threaded programo havas nur unu fingro. Sed disfadeniga programo havas plurajn fingrojn.
Ĉiu fingro ankoraŭ movas al la sekvanta linio de kodo kiel difinita de
la fluo kontrolo deklaroj, sed la fingroj povas esti en malsamaj lokoj
en la programo, ekzekutante malsamaj linioj de kodo samtempe. (Ĉiuj el la programoj en tiu libro ĝis nun estis sola interne.)
Prefere ol, havante ĉiuj viaj kodo atendas ĝis la
time.sleep()
funkcio finas, vi povas ekzekuti la malfrua aŭ planita kodo en aparta fadeno uzante Python threading
modulo. La aparta fadeno estos paŭzi por la time.sleep
alvokoj. Dume, via programo povas fari alian laboron en la originala fadeno.
Fari apartan fadenon, vi unue bezonas fari
Thread
objekto nomante la threading.Thread()
funkcio. Eniri la sekvan kodon en nova dosiero kaj savi ĝin kiel threadDemo.py: importado threading, tempo presi ( 'Komenco de programo.') ❶ def takeANap (): time.sleep (5) print ( 'Vekiĝu!') ❷ threadObj = threading.Thread (target = takeANap) ❸ threadObj.start () print ( 'Fino de programo.')
Ĉe ❶, ni difini funkcion kiu ni volas uzi en nova fadeno. Krei
Thread
objekton, ni nomas threading.Thread()
kaj fordoni la ŝlosilvorto argumento target=takeANap
❷. Tio signifas la funkcion ni volas nomi en la nova fadeno estas takeANap()
. Rimarku ke la ŝlosilvorto argumento estas target=takeANap
, ne target=takeANap()
. Tiu estas ĉar vi volas pasi la takeANap()
funkcio kiel la argumento, ne voku takeANap()
migru lia reveno valoro.
Post ni stoki la
Thread
objekto kreita de threading.Thread()
en threadObj
ni nomas threadObj.start()
❸ krei la novan fadenon kaj komenci ekzekuti la celo funkcio en la nova fadeno. Kiam tiu programo kuras, la eligo aspektos tiel ĉi: Komenci de programo. Fine de programo. Vekiĝu!
Tio povas esti iom konfuza. Se
print('End of program.')
Estas la lasta linio de la programo, vi eble pensas ke ĝi devus esti la lasta afero presita. La kialo Wake up!
Venas post ĝi estas ke kiam threadObj.start()
estas nomita, la celo funkcio por threadObj
kuras en nova fadeno de ekzekuto. Rigardante ĝin kiel duan fingron aperanta ĉe la komenco de la takeANap()
funkcio. La ĉefa fadeno daŭre print('End of program.')
. Dume, la nova fadeno kiu estis efektiviganta la time.sleep(5)
alvoko, paŭzoj dum 5 sekundoj. Post vigla de lia 5-dua nap, presas 'Wake up!'
Kaj tiam revenas de la takeANap()
funkcio. Kronologie, 'Wake up!'
Estas la lasta afero presita por la programo.
Kutime programo finiĝas kiam la lasta linio de kodo en la dosiero kuri (aŭ la
sys.exit()
funkcio estas nomita). Sed threadDemo.py havas du fadenoj. La unua estas la origina fadeno kiu komencis ĉe la komenco de la programo kaj finiĝas post print('End of program.')
. La dua fadeno estas kreita kiam threadObj.start()
estas nomita, komenciĝas ĉe la komenco de la takeANap()
funkcio, kaj finiĝas post takeANap()
redonas.
Al Python programo ne finiĝas ĝis ĉiuj liaj fadenoj esti finita. Kiam vi kuris threadDemo.py, kvankam la originala fadeno estis finita, la dua fadeno ankoraŭ ekzekuti la
time.sleep(5)
alvoko. Pasante Argumentoj al la fadeno de Cel Funkcio
Se la celo funkcio vi volas kuri en la nova fadeno prenas argumentojn, vi povas pasi la celo funkcio argumentoj por
threading.Thread()
. Ekzemple, diru vi volis kuri ĉi print()
alvoko por propra fadeno: >>> Print ( 'Katoj', 'Hundoj', 'Ranoj', Sep = '') Katoj & Dogs & Ranoj
Ĉi
print()
alvoko havas tri regulajn argumentoj, 'Cats'
, 'Dogs'
kaj 'Frogs'
, kaj unu ŝlosilvorto argumento, sep=' & '
. La regula argumentoj povas esti pasita kiel listo por la args
ŝlosilvorto argumento en threading.Thread()
. La ŝlosilvorto argumento povas esti precizigita kiel vortaro de la kwargs
ŝlosilvorto argumento en threading.Thread()
.
Eniri la sekva en la interaga konko:
>>> Import threading >>> ThreadObj = threading.Thread (target = print, argumentojn = [ 'katoj', 'Hundoj', 'Ranoj'], kwargs = { 'sep': ''}) >>> ThreadObj.start () Katoj & Dogs & Ranoj
Certigi la argumentoj
'Cats'
, 'Dogs'
kaj 'Frogs'
get pasis al print()
en la nova fadeno, ni pasas args=['Cats', 'Dogs', 'Frogs']
al threading.Thread()
. Certigi la ŝlosilvorto argumento sep=' & '
gets pasis al print()
en la nova fadeno, ni pasas kwargs={'sep': '& '}
al threading.Thread()
.
La
threadObj.start()
alvoko kreos novan fadenon voki la print()
funkcio, kaj ĝi pasos 'Cats'
, 'Dogs'
kaj 'Frogs'
kiel argumentoj kaj ' & '
por la sep
ŝlosilvorto argumento.
Tio estas malĝusta maniero por krei la novajn fadeno kiu nomas
print()
: threadObj = threading.Thread (target = print ( 'Katoj', 'Hundoj', 'Ranoj', Sep = ''))
Kion tio finas farante estas vokanta la
print()
funkcion kaj pasante lia reveno valoro ( print()
's reveno valoro estas ĉiam None
) kiel la target
ŝlosilvorto argumento. Ĝi ne pasas la print()
funkcio mem. Kiam pasanta argumentoj al funkcio en nova fadeno, uzi la threading.Thread()
funkcio estas args
kaj kwargs
ŝlosilvorto argumentoj. konkurenco Issues
Vi povas facile krei plurajn novajn fadenojn kaj havi ilin ĉiuj kurante samtempe. Sed multoblaj fadenoj povas ankaŭ kaŭzi problemojn nomata konkurenco temoj. Tiuj aferoj okazos kiam fadenoj legi kaj skribi variablojn samtempe, kaŭzante la fadenoj stumbli super ĉiu alia. Konkurenco temoj povas esti malfacile reprodukti konsekvence, farante ilin malfacile debug.
Disfadeniga programado estas ĝia propra vasta temo kaj preter la kadro de tiu ĉi libro. Kion vi devas konsideri estas jena: Eviti konkurenco aferoj, neniam lasu multoblaj fadenoj legi aŭ skribi la sama variablo. Kiam vi kreas novan
Thread
objekto, certigu lian celon funkcio uzas nur lokaj variabloj en tiu funkcio. Ĉi evitos malmola-al-debug konkurenco temoj en viaj programoj. noto
Al komencanto de tutorial sur disfadeniga programado estas haveblaj ĉe http://nostarch.com/automatestuff/ .
Projekto: disfadeniga XKCD Downloader
En ĉapitro 11 , vi skribis programon kiu elŝutis ĉiujn la XKCD bildstrioj de la XKCD retejo. Tio estis unu-threaded programo: ĝi elŝutis unu komika samtempe.
Multe de la programo rultempo estis elspezita establante la retkonekton
komenci la download kaj skribi la elŝutita bildoj al la malmola disko.
Se vi havas larĝan bandon Interreta konekto, via sola threaded programo
ne estis plene utiliganta la larĝa de disponebla bando.
A
disfadeniga programo kiu havas kelkaj fadenoj elŝuto bildstrioj dum
aliaj estas establanta rilatojn kaj skribis la komikan bildon dosierojn
al disko uzas vian Interretan konekton pli efike kaj elŝutas la kolekto
de komiksoj pli rapide. Malfermi novan dosieron redaktanto fenestro kaj savi ĝin kiel multidownloadXkcd.py . Vi modifos ĉi programo aldoni multithreading. La tute redaktita fontkodo estas havebla elŝuti de http://nostarch.com/automatestuff/ .
Paŝo 1: Modifi la Programo Uzi Funkcio
Tiu programo plejparte la sama elŝutanta kodo de Ĉapitro 11 , do mi saltas la klarigo por la Petoj kaj BeautifulSoup kodon. La ĉefaj ŝanĝoj vi bezonas fari estas importi la
threading
modulo kaj farante downloadXkcd()
funkcio, kiu prenas startanta kaj finante komikajn numerojn kiel parametroj.
Ekzemple, nomante
downloadXkcd(140, 280)
lin buklo super la elŝutanta kodon por elŝuti la komiksojn ĉe http://xkcd.com/140 , http://xkcd.com/141 , http://xkcd.com/142 , kaj tiel plu, ĝis al http://xkcd.com/279 . Ĉiu fadeno ke vi kreas nomos downloadXkcd()
migru malsama gamon de bildstrioj elŝuti.
Aldonu la sekvan kodon al via multidownloadXkcd.py programo:
#! python3 # MultidownloadXkcd.py - Elŝutoj XKCD bildstrioj uzanta multoblajn fadenojn. importado petoj, os, BS4, threading ❶ os.makedirs ( 'xkcd', exist_ok = Vera) # vendejo bildstrioj en ./xkcd ❷ def downloadXkcd (startComic, endComic): ❸ por urlNumber en gamo (startComic, endComic): # Elŝutu la paĝon. print ( 'Elŝutado paĝon http: //xkcd.com/%s ...'% (urlNumber)) ❹ res = requests.get ( 'http://xkcd.com/%s'% (urlNumber)) res.raise_for_status () ❺ supo = bs4.BeautifulSoup (res.text) # Trovi la URL de la komika bildo. ❻ comicElem = soup.select ( '# komika img') se comicElem == []: presi ( 'Ne eblis trovi komikan bildon.') alie: ❼ comicUrl = comicElem [0] .get ( 'fonto') # Elŝutu la bildon. print ( 'Elŝutanta bildo% s ...'% (comicUrl)) ❽ res = requests.get (comicUrl) res.raise_for_status () # Konservu la bildon por ./xkcd. imageFile = malfermita (os.path.join ( 'xkcd', os.path.basename (comicUrl)), 'WB) por bloko en res.iter_content (100000): imageFile.write (bloko) imageFile.close () # TODO: Krei kaj komenci la fadenon objektoj. # TODO: Atendu ĉiuj fadenoj fini.
Post importi la moduloj ni bezonas, ni faros dosierujon por stoki bildstrioj en ❶ kaj komenci difini
downloadxkcd()
❷. Ni buklo tra ĉiuj nombroj en la specifita gamo ❸ kaj elŝuti ĉiun paĝon ❹. Ni uzu Belega Supo rigardi tra la HTML de ĉiu paĝo ❺ kaj trovi la komikaj bildo ❻. Se neniu komikaj bildo troviĝas sur paĝo, ni presi mesaĝon. Alie, ni preni la URL de la bildo ❼ kaj elŝuti la bildon ❽. Fine, ni savu la bildon al la dosierujo ni kreis.Paŝo 2: Krei kaj Start Fadenoj
Nun ke ni jam difinis
downloadXkcd()
, ni kreas la multoblaj fadenoj ke ĉiu voki downloadXkcd()
elŝuti malsamaj gamoj de komiksoj de la XKCD retejo. Aldonu la sekvan kodon por multidownloadXkcd.py post la downloadXkcd()
funkcio difino:#! python3 # MultidownloadXkcd.py - Elŝutoj XKCD bildstrioj uzanta multoblajn fadenojn. --snip-- # Krei kaj komenci la fadenon objektoj. DownloadThreads = [] # liston de ĉiuj la Fadeno objektoj por i en gamo (0, 1400, 100): # masxojn 14 fojojn, kreas 14 fadenoj downloadThread = threading.Thread (target = downloadXkcd, argumentojn = (i, i + 99)) downloadThreads.append (downloadThread) downloadThread.start ()
Unue ni faru empy listo
downloadThreads
; la listo helpos konservi trako de la multaj Thread
objektoj ni kreas. Tiam ni komencu nian for
buklo. Ĉiufoje tra la buklo, ni kreas Thread
objekton kun threading.Thread()
, postglui la Thread
celon al la lerta, kaj voku start()
al komenci kuranta downloadXkcd()
en la nova fadeno. Ekde la for
buklo fiksas la i
variablo de 0
al 1400
en paŝoj de 100
, i
estos metita 0
sur la unua ripeto, 100
sur la dua iteracio, 200
la trian, kaj tiel plu. Ĉar ni pasas args=(i, i + 99)
al threading.Thread()
la du argumentoj pasitaj al downloadXkcd()
Estos 0
kaj 99
sur la unua ripeto, 100
kaj 199
sur la dua iteracio, 200
kaj 299
en la tria, kaj tiel plu.
Kiel la
Thread
objekto start()
metodo nomiĝas kaj la nova fadeno komencas kuri la kodon ene downloadXkcd()
, la ĉefa fadeno daŭros la sekva ripeto de la for
ciklo kaj krei la proksima fadeno.Paŝo 3: Atendu Ĉiuj Fadenoj al End
La ĉefa fadeno pluiras kiel normala dum la aliaj fadenoj ni kreas download bildstrioj. Sed diri ke estas iu kodo vi ne volas kuri en la ĉefa fadeno ĝis ĉiuj fadenoj esti kompletigita. Nomante
Thread
objekto join()
metodo blokos ĝis tiu fadeno finis. Uzante for
buklo persisti super ĉiuj Thread
objektoj en la downloadThreads
listo, la ĉefa fadeno povas nomi la join()
metodon en ĉiu de la aliaj fadenoj. Aldonu la sekvan al la fundo de via programo:#! python3 # MultidownloadXkcd.py - Elŝutoj XKCD bildstrioj uzanta multoblajn fadenojn. --snip-- # Atendu ĉiuj fadenoj fini. Por downloadThread en downloadThreads: downloadThread.join () print ( 'Farita.')
La
'Done.'
ĉeno ne presis ĝis ĉiuj la join()
vokoj revenis. Se Thread
objekto jam kompletigis kiam lia join()
metodo nomiĝas, tiam la telefono simple reveni tuj. Se vi volas etendi ĉi programo kun kodo kiu kuras nur post ĉiu el la komiksoj elŝutita, vi povus anstataŭigi la print('Done.')
linion kun via nova kodo.Ĵeto Aliaj Programoj de Python
Via Python programo povas komenci aliajn programojn sur via komputilo per la
Popen()
funkcio en la enkonstruita subprocess
modulo. (La P en la nomo de la Popen()
funkcio signifas procezon .) Se vi havas plurajn ekzemplojn de apliko malfermita, ĉiu el tiuj kazoj estas aparta procezo de la sama programo. Ekzemple,
se vi malfermas plurajn fenestrojn de via retumilo samtempe, ĉiu el
tiuj fenestroj estas malsamaj procezo de la retumilo programo. Vidu Figuron 15-1 kiel ekzemplon de multnombraj kalkulilo procezoj malfermitaj samtempe.
Ĉiu procezo povas havi multoblajn fadenojn. Kontraste fadenoj, procezo ne povas rekte legi kaj skribi alian procezon de variabloj. Se
vi pensas de disfadeniga programon kiel havanta multoblajn fingroj
jenaj fontkodo, tiam havanta multoblajn procezojn de la sama programo
malfermita estas kiel havi amikon apartan kopion de la programo
fontkodo. Vi ambaŭ sendepende efektiviganta la saman programon.
Se vi volas komenci ekstera programo de via Python script, pasi la programo dosiernomo por
subprocess.Popen()
. (Sur Vindozo, dekstra-klaki la apliko de Komenco menuero kaj elektu Properties por vidi kiel la apliko dedosiernomo. Sur OS X, CTRL -click la apliko kaj elektu Montri Pako Enhavo trovi la vojon al la plenumebla dosiero.) La Popen()
funkcio tiam tuj revenos. Memoru ke la lanĉita programo ne kuri en la sama fadeno kiel via Python programo.
Figuro 15-1. Ses kurante procezoj de la sama kalkulilo programon
Sur Vindoza komputilo, eniri la sekva en la interaga konko:
>>> Import subprocess >>> subprocess.Popen ( 'C: \\ Windows \\ system32 \\ calc.exe') <subprocess.Popen objekto ĉe 0x0000000003055A58>
Sur Ubuntu Linukso, vi enirus la sekvajn:
>>> Import subprocess >>> subprocess.Popen ( '/ usr / bin / gnome-kalkulilo') <subprocess.Popen objekto ĉe 0x7f2bcf93b20>
Sur OS X, la procezo estas iom malsamaj. Vidi Opening Dosieroj kun Defaŭlta Aplikoj .
La reveno valoro estas
Popen
objekto, kiu havas du utilajn metodojn: poll()
kaj wait()
.
Vi povas pensi pri la
poll()
metodo kiel demandanta vian amikon, se ŝi finis kuri la kodon vi donis sxin. La poll()
metodo revenos None
se la procezo estas ankoraŭ kurante en la tempo poll()
estas nomita. Se la programo finiĝis, ĝi revenos la procezo estas entjero eliro kodon . Eliron kodo estas uzataindiki ĉu la procezo finita sen eraroj (eliron Poŝtkoda 0
) aŭ ĉu eraro kaŭzis la procezo fini (nenula eliro kodo ĝenerale 1
, sed povas varii dependanta sur la programo).
La
wait()
metodo estas kiel atendas vian amikon fini laborante en sia kodo antaŭ vi tenas laboranta sur via. La wait()
metodo blokos ĝis la lanĉita procezo finita. Tio estas utila se vi volas, ke via programo paŭzi ĝis la uzanto finas kun la alia programo. La reveno valoro de wait()
estas la procezo de entjero eliro kodon.
En Windows, tajpu la sekvajn en la interaga ŝelo. Notu ke la
wait()
alvoko blokos ĝis vi finas la lanĉita kalkulilo programon.❶ >>> calcProc = subprocess.Popen ( 'c: \\ Windows \\ system32 \\ calc.exe') ❷ >>> calcProc.poll () == None veraj ❸ >>> calcProc.wait () 0 >>> CalcProc.poll () 0
Tie ni malfermas kalkulilo procezo ❶. Dum ĝi estas ankoraŭ kurante, ni kontrolu se
poll()
revenoj None
❷. Ĝi devus, kiel la procezo ankoraŭ kurante. Tiam ni fermas la kalkulilo programon kaj vokis wait()
sur la finita procezo ❸. wait()
Kaj poll()
nun revenas 0
, indikante ke la procezo finita sen eraroj.Pasante Komando Linio Argumentoj por Popen ()
Vi povas pasi komandlinio argumentoj por procezoj vi kreas kun
Popen()
. Por tion fari, vi pasas listo kiel la sola argumento por Popen()
. La unua ĉeno en tiu listo estos la ruleblan dosiernomo de la programo vi volas lanĉi; ĉiuj postaj kordoj estos la komandlinio argumentoj pasi al la programo kiam ĝi startas. En efekto, ĉi tiu lerta estos la valoro de sys.argv
la lanĉis programon.
Plej
aplikoj kun grafika uzulinterfaco (GUI) ne uzas komandlinio argumentoj
tiel vaste kiel komandlinia bazita aŭ terminalbazitan programoj faras. Sed plej GUI aplikoj akceptos sola argumento por dosiero ke la aplikoj tuj malfermos kiam komenci. Ekzemple, se vi uzas Windows, krei simplan tekston dosiero nomata C: \ hello.txt kaj tiam eniri la sekva en la interaga konko:
>>> Subprocess.Popen ([ 'C: \\ Windows \\ notepad.exe', 'C: \\ hello.txt'])
<subprocess.Popen objekto ĉe 0x00000000032DCEB8>
Tio ne nur lanĉi la Notepad apliko sed ankaŭ havas ĝin tuj malfermos la C: \ hello.txt dosiero.
Tasko Scheduler, launchd kaj cron
Se vi komputilo savvy, vi sciu pri Task Scheduler sur Vindozo, launchd sur OS X, aŭ la cron vicigilo sur Linukso. Tiuj bone dokumentitakaj fidindaj iloj ĉiuj permesos plani aplikojn ĵeti ĉe specifaj tempoj. Se vi ŝatus lerni pli pri ili, vi povas trovi ligilojn al lernilojn en http://nostarch.com/automatestuff/ .
Uzante
via mastruma sistemo korpigita vicigilo savas vin el skribanta vian
propran horloĝon-kontrolanta kodo enhorarigi vian programoj. Tamen, uzu la
time.sleep()
funkcion se vi nur bezonas vian programon paŭzi mallonge. Aŭ anstataŭ uzi la operaciumo vicigilo, via kodo povas buklo ĝis certa dato kaj tempo, nomante time.sleep(1)
ĉiu tempo tra la buklo.Malfermante ejo kun Python
La
webbrowser.open()
funkcio povas lanĉi retumilo de via programo al specifa retejo, prefere ol malfermanta la retumilo apliko kun subprocess.Popen()
. Vidi Projekto: mapit.py kun la webbrowser Modulo por pli detaloj.Kurante Aliaj Python Skriptoj
Vi povas lanĉi Python skripton de Python simple kiel ajna alia apliko. Vi nur devas pasi la python.exe plenumebla al
Popen()
la dosiernomo de la .py skripto vi volas kuri kiel ĝia argumento. Ekzemple, la jena kurus la hello.py skripto de Ĉapitro 1 :>>> Subprocess.Popen ([ 'C: \\ python34 \\ python.exe', 'hello.py'])
<subprocess.Popen objekto ĉe 0x000000000331CF28>
Pasi
Popen()
listo enhavanta kordo de la Python plenumebla la padon kaj linio de la skripto la dosiernomo. Se la skripto vi ĵeti bezonoj komandlinio argumentoj, aldonu ilin al la listo post la skripto la dosiernomo. La loko de la Python plenumebla en Windows estas C: \ python34 \ python.exe . Sur OS X, tio estas /Library/Frameworks/Python.framework/Versions/3.3/bin/python3 . Sur Linukso, ĝi estas / usr / bin / python3 .
Kontraste importanta la Python programo kiel modulo, kiam via Python
programo ĵetas alian Python programo, la du estas kuri en apartaj
procezoj kaj ne povi dividi ĉiun alies variabloj.
Malfermante Dosieroj kun Defaŭlta Aplikoj
Duoble klakante .txt dosieron en via komputilo aŭtomate lanĉi la apliko asociita kun la .txt dosiersufikso. Via komputilo havos plurajn tiajn dosiersufikso asocioj starigis jam. Python povas ankaŭ malfermi dosierojn tiel kun
Popen()
.
Ĉiu mastruma sistemo havas programon kiu elfaras la ekvivalento de duobla-klakanta dokumenton dosieron por malfermi. En Windows, ĉi tiu estas la
start
programo. Sur OS X, tio estas la open
programo. Sur Ubuntu Linukso, tiu estas la see
programo. Eniri la sekva en la interaga ŝelo, pasante 'start'
, 'open'
aŭ 'see'
al Popen()
dependanta sur via sistemo:>>> FileObj = malfermita ( 'hello.txt', 'w') >>> fileObj.write ( 'Saluton mondo!') 12 >>> FileObj.close () >>> import subprocess >>> subprocess.Popen ([ ' komenci ', 'hello.txt'], ŝelo = Vera)
Tie ni skribu
Hello world!
al nova hello.txt dosiero. Tiam ni nomas Popen()
, preter listo enhavanta la programo nomo (en tiu ekzemplo, 'start'
por Windows) kaj la dosiernomo. Ni ankaŭ pasas la shell=True
ŝlosilvorto argumento, kiu bezonas nur sur Vindozo. La mastruma sistemo scias ĉiuj la dosiero asocioj kaj povas diveni ke ĝi devus ĵeti, diru, Notepad.exe manipuli la hello.txt dosiero.
Sur OS X, la
open
programo estas uzata por malfermi ambaŭ dokumenton dosierojn kaj programojn. Eniri la sekva en la interaga ŝelo se vi havas Mac:>>> Subprocess.Popen ([ 'malfermita', '/Applications/Calculator.app/'])
<subprocess.Popen objekto ĉe 0x10202ff98>
La kalkulilo app devus malfermi.
Projekto: Simpla Countdown Programo
Samkiel estas malfacile trovi simplan cronómetro apliko, ĝi povas esti malfacile trovi simplan rakontas aplikon. Ni skribi Countdown programo kiu ludas alarmon ĉe la fino de la rakontas malantaŭen.
Je alta nivelo, jen kion via programo faros:
- Rakontas malantaŭen de 60.
- Ludi sondosieron ( alarm.wav ) kiam la rakontas malantaŭen atingas nulon.
Tio signifas via kodo devos fari la sekvan:
- Paŭzi por dua intere montri ĉiu nombro en la Countdown nomante
time.sleep()
. - Voku
subprocess.Popen()
malfermi la sondosiero kun la defaŭlta aplikaĵo.
Malfermi novan dosieron redaktanto fenestro kaj savi ĝin kiel countdown.py .
Paŝo 1: Count Down
Tiu programo postulos la
time
modulo por la time.sleep()
funkcio kaj la subprocess
modulo por la subprocess.Popen()
funkcio. Eniri la sekvan kodon kaj savi la dosiero countdown.py :#! python3 # Countdown.py - Simpla Countdown skripton. importado tempo, subprocess ❶ timeLeft = 60 dum timeLeft> 0: ❷ print (timeLeft, fino = '') ❸ time.sleep (1) ❹ timeLeft = timeLeft - 1 # TODO: Fine de la rakontas malantaŭen, ludi sonon dosiero.
Post importi
time
kaj subprocess
provu variablo nomata timeLeft
teni la nombron da sekundoj forlasitaj en la Countdown ❶. Ĝi
povas komenci ĉe 60-aŭ vi povas ŝanĝi la valoron tie al kiom vi bezonas
aŭ eĉ havi ŝin akiras metita de komandlinio argumento.
En
while
buklo, vi montros la ceteraj grafo ❷, paŭzi por dua ❸ kaj tiam dekremento la timeLeft
variablo ❹ antaux la ciklo komenciĝas denove. La buklo gardos looping dum timeLeft
superas 0
. Post tio, la rakontas estos super.Paŝo 2: Ludi la Sono Dosiero
Dum
estas triapartaj moduloj ludi sondosieroj de diversaj formatoj, la
rapida kaj facila maniero estas simple ĵeti ajn apliko la uzanto jam
uzas ludi sondosieroj. La mastruma sistemo elkompreni de la .wav dosiersufikso kiu apliko devus lanĉi ludi la dosiero. Tiun .wav dosiero povus facile esti kelkaj aliaj sondosiero formato, kiel ekzemple .mp3 aŭ Ogg .
Vi povas uzi ajnan sondosiero kiu estas sur via komputilo ludi je la fino de la rakontas malantaŭen, aŭ vi povas elŝuti alarm.wav de http://nostarch.com/automatestuff/ .
Aldonu la jenan al via kodo
#! python3 # Countdown.py - Simpla Countdown skripton. importado tempo, subprocess --snip-- # Fine de la rakontas malantaŭen, ludi sonon dosiero. Subprocess.Popen ([ 'komenci', 'alarm.wav'], ŝelo = Vera)
Post la
while
buklo finas, alarm.wav (aŭ la sondosiero vi elektas) ludos por sciigi al la uzanto kiun la rakontas malantaŭen estas super. En Vindozo, nepre inkluzivi 'start'
en la listo vi pasas al Popen()
migru la ŝlosilvorto argumento shell=True
. Sur OS X, pasi 'open'
anstataŭ 'start'
kaj forigi shell=True
.
Anstataŭ ludi sondosieron, vi povus savi tekstdosiero ie kun mesaĝo kiel Break tempo estas finita! Kaj uzi
Popen()
por malfermi ĝin fine de la rakontas malantaŭen. Tio efike krei popo-supren fenestro kun mesaĝo. Aŭ vi povus uzi la webbrowser.open()
funkcion malfermi specifa retejo fine de la rakontas malantaŭen. Kontraste iuj liberaj Countdown apliko vi trovus rete, via propra rakontas malantaŭen programo alarmo povas esti io vi deziras!Ideoj por Similaj Programoj
Al rakontas estas simpla prokrasto antaŭ daŭrigi la programo ekzekuto. Tiu povas ankaŭ esti uzita por aliaj aplikoj kaj karakterizaĵoj, kiel ekzemple la jenaj:
- Uzas
time.sleep()
por doni al la uzanto ŝancon premi CTRL -C nuligi agon, kiel forviŝo dosierojn. Via programo povas presi "Gazetara CTRL -C nuligi" mesaĝon kaj tiam manipuli ajnanKeyboardInterrupt
esceptoj kuntry
kajexcept
deklaroj. - Por longtempa Countdown, vi povas uzi
timedelta
objektojn mezuri la numeron de tagoj, horoj, minutoj kaj sekundoj ĝis iu punkto (a naskiĝtago? Datreveno?) En la estonteco.
resumo
La Unix epoko (januaro 1, 1970, je noktomezo UTC) Estas norma referenco tempon por multaj programlingvoj, inkluzive de Python. Dum la
time.time()
funkcio modulo redonas epoko tempstampo (te, kaleŝego valoron de la nombro de sekundoj ekde la Uniksa epoko), la datetime
modulo estas bona por elfaranta daton aritmetiko kaj formatado aŭ sintaksa analizo kordoj kun data informo.
La
time.sleep()
funkcio blokos (te, ne revenu) por certa nombro da sekundoj. Ĝi povas esti uzata por aldoni paŭzoj al via programo. Sed se vi volas plani viajn programojn komenci en momento donita, la instrukcioj ĉe http://nostarch.com/automatestuff/ povas diri al vi kiel uzi la vicigilo jam provizita de via mastruma sistemo.
La
threading
modulo
estas uzata por krei plurajn fadenojn, kiuj estas utila kiam vi devas
elŝuti plurajn dosierojn aŭ fari aliajn taskojn samtempe. Sed certigi la fadeno legas kaj skribas nur lokaj variabloj, aŭ vi povus kolizii konkurenco temoj.
Fine, vian Python-programoj povas lanĉi aliajn aplikojn kun la
subprocess.Popen()
funkcio. Komandlinio argumentoj povas esti pasita al la Popen()
alvoko por malfermi specifaj dokumentoj kun la apliko. Alternative, vi povas uzi la start
, open
, aŭ see
programon kun Popen()
uzi via komputilo dosiero asocioj por aŭtomate eltrovi kiun aplikaĵon por uzi por malfermi dokumenton. Uzante la aliaj aplikoj sur via komputilo, via Python programoj povas utiligi iliajn kapablojn por via aŭtomatigo bezonoj.praktiko Demandoj
Q:
|
1. Kio estas la Unikso epoko?
|
Q:
|
2. Kio redonas la nombron de sekundoj ekde la Uniksa epoko?
|
Q:
|
3. Kiel vi povas paŭzi vian programon por ĝuste 5 sekundoj?
|
Q:
|
4. Kion signifas la
round() funkcion reveni? |
Q:
|
5. Kio estas la diferenco inter
datetime objekto kaj timedelta celon? |
Q:
|
6. Diru vi havas funkcion nomita
spam() . Kiel vi nomas tiun funkcion kaj kuri la kodon en ĝi en aparta fadeno? |
Q:
|
7. Kion vi faras por eviti konkurenco demandoj kun multoblaj fadenoj?
|
Q:
|
8. Kiel vi povas havi vian Python programo kuras la calc.exe programo situas en la C: \ Windows \ system32 dosierujo?
|
praktiko Projektoj
Por praktiko, skribi programojn kiuj faras la sekvan.
Prettified Stopwatch
Vastigi la cronómetro projekto de ĉi tiu ĉapitro por ke ĝi uzas la
rjust()
kaj ljust()
ŝnuro metodoj "Prettify" la eligo. (Tiuj metodoj estis kovritaj en Ĉapitro 6 .) Anstataŭ eligo kiel tiu:Lap # 1: 3.56 (3.56) Lap # 2: 8.63 (5.07) Lap # 3: 17.68 (9.05) Lap # 4: 19.11 (1.43)
... La eligo aspektos tiel ĉi:
Lap # 1: 3.56 (3.56) Lap # 2: 8.63 (5.07) Lap # 3: 17.68 (9.05) Lap # 4: 19.11 (1.43)
Notu ke vi bezonos ŝnuro versioj de la
lapNum
, lapTime
kaj totalTime
entjera kaj flosi variabloj por nomi la kordo metodoj sur ilin.
Sekva, uzi la
pyperclip
modulon enkondukita en ĉapitro 6 kopii la tekston eligo al la tondujo tiel la uzanto povas rapide almeti la eligo por teksta dosiero aŭ retpoŝto.Planita Web Comic Downloader
Skribi
programon kiu kontrolas la retejoj de pluraj ttt bildstrioj kaj
aŭtomate elŝutas la bildoj se la bildstrio estis ĝisdatigita ekde la
programo lasta vizito. Via operaciumo vicigilo (Scheduled
Taskoj sur Vindozo, launchd sur OS X, kaj cron sur Linukso) povas kuri
via Python programo unufoje tage. La Python programo mem povas elŝuti la komika kaj kopii ĝin al via labortablo por ke estas facile trovi. Ĉi liberigos vin de devi kontroli la retejon mem vidi ĉu ĝi ĝisdatigis. (Listo de ttt bildstrioj estas haveblaj ĉe http://nostarch.com/automatestuff/ .)
Nenhum comentário:
Postar um comentário