L7: linux linux: Prosessit linux: Prosessit Jokainen komento käynnistää vähintään yhden prosessin Jokaiselle prosessilla tunniste PID, jolla prosessiin voidaan viitata. Jokaisella prosesilla on prioriteetti PRI. Se kertoo paljonko prosessi käyttää koneen resursseja muihin prosesseihin nähden Normaalisti komento käynnistää prosessin aktiiviseksi komento & käynnistää prosessin taustalle Esimerkki: emacs nimi & siirtää editorin taustalle ja linux komentotulkissa voi edelleen antaa muita komentoja ps tulostaa aktiiviset prosessit Ctrl + c lopettaa aktiivisen prosessin kill PID lopettaa prosessin PID, jos siihen on oikeudet linux: Prosessit jobs tulostaa käynnissä olevat työt. Tulostus voi olla vaikkapa [1] Running emacs tila2015.tex & [5]- Running evince tila2015.pdf & top listaa tietoa käynnissä olevista prosessit prosessorin käytön mukaan Prioriteetti välillä 20 PRI +19. Pienempi PRI Tärkeämpi prosessi Käyttäjien PID 0 (Oletus = 0) nice -n arvo komento käynnistää komennon prioriteetilla PRI=arvo. Esimerkki: nice -n +3 python käynnistää python:n prioriteetilla PRI=3 ps -lx grep python kertoo, että prosessilla on PID=6632 renice +5 6632 muuttaa PRI=5:een PRI arvoa voi vain kasvattaa (vähentää prosessin tärkeyttä) Miksi ja milloin?
String manipulointi (kuva: @LoadingArtist.com) python Useita python komentoja Esimerkki 1 A= abcd ; x=a.find( c ); print(x) tulostaa 2 Esimerkki 2 B= o,1,p ; x=b.split(, ); print(x) tulostaa [ o, 1, p ], = Erotin Esimerkki 3 B= o 1 p ; x=b.split(); print(x) tulostaa [ o, 1, p ] tyhjä= Oletus (default) erotin Esimerkki 4 A= Lauri ; B=A.strip( L ) ; print(b) tulostaa auri Mahdotonta muistaa komennot ulkoa vuoden (päivän, tunnin?) päästä Komento grep.split *.py Malli kaikista ohjelmista *.py joissa esiintyy komento.split
String manipulointi # K o m e n t t i r i v i : Tama on python ohjelmani S t r i n g m a l l i 1. py # J o i t a k i n esimerkkeja s t r i n g i e n m a n i p u l o i n n i s t a # import os ; os. system ( clear ) # Tyhjennetaan n a y t t o a= " karhunkierros " ; b=a. find ( " karhu " ) # E t s i t e k s t i p r i n t ( b =, b ) # Tulos ============= d = AbCd ; e=d. upper ( ) # I s o i k s i k i r j a i m i k s i p r i n t ( d =,d,, e=, e ) # Tulos ============= f = EfGh ; g= f. lower ( ) # P i e n i k s i k i r j a i m i k s i p r i n t ( f =, f,, g=, g ) # Tulos ============= j = xku xnkkx ; k= j. replace ( x, a ) # Korvaa x m e r k i l l a a p r i n t ( j =, j,, k=, k ) # Tulos ============= l = ABNyt OKABAB ; m= l. s t r i p ( AB ) # Poista m erkit AB p r i n t ( l =, l,,m=,m) # Tulos ============= o= x ; h ; 8 ; 9 ; p=o. s p l i t ( ; ) # Jaa e r o t t i m e l l a = ; p r i n t ( o =,o,, p=, p ) # Tulos ============= p r i n t ( p [ 0 ] =, p [ 0 ] ) # p : n 1. e l e m e n t t i python3 Stringmalli1.py tulostaa b = 0 d = AbCd,e= ABCD f = EfGh,g= efgh j = xku xnkkx,k= aku ankka l = ABNyt OKABAB,m= Nyt OK o = x;h;8;9,p= [ x, h, 8, 9 ] p[0]= x
Formatointi Reaaliluvun muunnos stringiksi a=9.89 ; b=str(a) ; print(b) tulostaa 9.89 print(type(a)) ; print(type(b)) tulostaa <class float > <class str > Reaaliluvun formatointi stringiksi a=4.567 ; b= %7.5f %a ; print(b) tulostaa 4.56700 Reaali- ja kokonaisluku stringiksi a=1.23; b=78; c= %3.1f%3i %(a,b) print(c) tulostaa 1.2 78 Mahdotonta muistaa ulkoa vuoden (päivän, tunnin?) päästä grep %i *.py Malli kaikista ohjelmista *.py, joissa esiintyy komento %i
Formatointi (kuva:@improgrammer.net) # Kome nttirivi : Tama on python ohjelmani Formatointimalli1. py # J o i t a k i n s t r i n g muunnoksen f o r m a t o i n t i esimerkkeja # import os ; os. system ( clear ) # Tyhjennetaan naytto # Reaaliluvun muunnos s t r i n g i k s i ============================ a =1.458 # Luku b=str ( a ) # Muunnos s t r i n g i k s i p r i n t ( b=,b,, type ( b)=, type ( b ) ) # T a r k i s t u s # Reaaliluvun formatointi : leveys =8, desimaalit=5 =========== c =7.89 # Luku d= %8.5 f %c # F o r m a t o i n t i print ( d=,d ) # T a r k i s t u s # Kokonaisluvun formatointi : leveys=6 ======================= e=71 # Luku f = %6i %e # F o r m a t o i n t i p r i n t ( f =, f ) # T a r k i s t u s # Reaaliluvun j a kokonaisluvun y h d i s t e t t y f o r m a t o i n t i ======= g = 2. 3 4 ; h= 912 # Luvut i= %4.1f%5i %(g, h ) # F o r m a t o i n t i p r i n t ( i =, i ) # T a r k i s t u s # Reaaliluku, string ja kokonaisluku yhdistetty ============= j = 9. 8 4 ; k= t e k s t i a ; l =812 # Y h d i s t e t t a v a t m= %6.0 f%10s%7i %( j, k, l ) # F o r m a t o i n t i print ( m=,m) # T a r k i s t u s # Reaaliluku, string, kokonaisluku ja \ & yhdistetty === n = 9. 2 3 ; o= 87 ; p= \\\\ # Y h d i s t e t t a v a t q= %8.3e & %3 i %2s %(n, o, p) # Formatointi p r i n t ( q=,q) # T a r k i s t u s python3 Formatointimalli1.py tulostaa b= 1.458, type(b)= <class str > d= 7.89000 f= 71 i= 2.3-912 m= 10 tekstia 812 q= 9.230e+00 & -87 \\
Formatointi # K o m e n t t i r i v i : Tama on python ohjelmani F o r m a t o i n t i m a l l i 2. py # J o i t a k i n p r i n t komennon f o r m a t o i n t i esimerkkeja # import os ; os. system ( clear ) # Tyhjennetaan n a y t t o # Esimerkkeja formatoidusta p r i n t komennosta ================= a =0.123456789 ; b= abcde ; c=123456 # f l o a t, s t r i n g, i n t e g e r p r i n t ( " %6.2 f " % (a ) ) # 6 merkkia, 2 desimaali p r i n t ( " %12.5 f " % (a ) ) # 1 2 merkkia, 5 desimaalia p r i n t ( "%8s " % (b ) ) # 1 2 merkkia p r i n t ( "%30s " % (b ) ) # 3 0 merkkia p r i n t ( "%6i " % (c ) ) # 6 merkkia p r i n t ( "%15 i " % (c ) ) # 1 5 merkkia p r i n t ( " %12.3 f%10s%8i " % (a, b, c ) ) # Yhdistelma p r i n t ( " %12.3 f & %10s & %8 i " % (a, b, c ) ) # L i s a t t y kaksi " & " merkkia python3 Formatointimalli2.py tulostaa 0.12 0.12346 abcde abcde 123456 123456 0.123 abcde 123456 0.123 & abcde & 123456
Datan lukeminen ja kirjoittaminen kuva: www.cartoonstock.com Formatointi: Datan lukeminen, kirjoittaminen ja näyttäminen Tärkein on lopputulos: Tulos sama eri tavoilla Malliohjelmat: Yritys ja erehdys n. 30 tuntia Luetaan ensin yksinkertaisempaa tiedostoa Mallidata1.dat ohjelmilla LueTiedosto1A.py ( readline=rivi) LueTiedosto1B.py ( readlines=rivilista) LueTiedosto1C.py ( numpy.loadtxt) Luetaan sitten monimutkaisempaa tiedostoa Mallidata1.dat ohjelmilla LueTiedosto2A.py ( readline=rivi) LueTiedosto1B.py ( readlines=rivilista) LueTiedosto1C.py ( numpy.loadtxt) Kirjoittaminen KirjoitaTiedosto1.py ( f.write) KirjoitaTiedosto2.py ( numpy.savetxt) Näistä malleista on teille myöhemmin hyötyä kun luette tai kirjoitatte tiedostoja
Datan lukeminen Luettava tiedosto Mallidata1.dat muotoa 1 A 2 B 3 C readline lukee RIVI kerrallaan kaksi kolumnia Lukee stringinä float(lukunyt) python LueTiedosto1A.py tulostaa [1.0] [ A ] [1.0, 2.0] [ A, B ] [1.0, 2.0, 3.0] [ A, B, C ] # K o m e n t t i r i v i : Tama on ohjelmani LueTiedosto1A. py import os ; os. system ( clear ) # Tyhjennetaan naytto luku = [ ] ; sana = [ ] # Luo kaksi t y h j a a muuttujaa f i l e = open ( M a l l i d a t a 1. dat, r ) # Avaa t i e d o s t o M a l l i d a t a 1. dat r i v i = f i l e. r e a d l i n e ( ) # LUETAAN RIVI KERRALLAAN while ( len ( r i v i ) > 0 ) : # Ei t y h j a r i v i osat= r i v i. s p l i t ( ) # Tyhjien mukaan o s i k s i lukunyt=osat [ 0 ] # 1. elementti sananyt=osat [ 1 ] # 2. elementti luku. append ( f l o a t ( l u k u n y t ) ) # Lisaa arvo muuttujaan luku sana. append ( sananyt ) # Lisaa arvo muuttujaan sana print ( luku, sana ) # Nayta n y k y i s e t a r v o t r i v i = f i l e. r e a d l i n e ( ) # Lue seuraava r i v i f i l e. close ( ) # S u l j e M a l l i d a t a 1. dat
Datan lukeminen Luettava tiedosto Mallidata1.dat muotoa 1 A 2 B 3 C readlines lukee KAIKKIEN RIVIEN kaksi kolumnia Lukee stringinä float(lukunyt) python LueTiedosto1B.py tulostaa [1.0] [ A ] [1.0, 2.0] [ A, B ] [1.0, 2.0, 3.0] [ A, B, C ] # K o m e n t t i r i v i : Tama on ohjelmani LueTiedosto1B. py # import os ; os. system ( clear ) # Tyhjennetaan naytto f = open ( M a l l i d a t a 1. dat, r ) # Avaa M a l l i d a t a 1. dat data = f. readlines ( ) # LUETAAN RIVILISTANA f. close ( ) # S u l j e M a l l i d a t a 1. dat luku = [ ] ; sana = [ ] # Luo kaksi t y h j a a muuttujaa for r i v i in data : # Looppi muuttujan data r i v e i l l e osat= r i v i. s p l i t ( ) # Tyhjien mukaan o s i k s i lukunyt=osat [ 0 ] # 1. elementti sananyt=osat [ 1 ] # 2. elementti luku. append ( f l o a t ( l u k u n y t ) ) # Lisaa arvo muuttujaan luku sana. append ( sananyt ) # Lisaa arvo muuttujaan sana print ( luku, sana ) # Nayta n y k y i s e t a r v o t
Datan lukeminen Luettava tiedosto Mallidata1.dat muotoa 1 A 2 B 3 C np.loadtxt lukee 1. kolumnin np.genfromtxt lukee 2. kolumnin np.loadtxt lukee suoraan vektoriksi # Kommenttirivi : tama on python ohjelmani LueTiedosto1C. py # import os ; os. system ( clear ) # Tyhjennetaan n a y t t o import numpy as np # numpy i m p o r t o i t u f i l e = M a l l i d a t a 1. dat # Tiedoston nimi luku=np. l o a d t x t ( f i l e, dtype= f l o a t, usecols = ( 0, ) ) # Lue 1. kolumni sana=np. genfromtxt ( f i l e, dtype= s t r, usecols = ( 1, ) ) # Lue 2. kolumni print ( luku, sana ) # Nayta m u u t t u j i e n a r v o t p r i n t ( np. cos ( luku ) ) # Muuttuja luku= v e k t o r i. S i i t a v o i laskea esim. c o s i n i n Kokeilin myös komentoa sana=np.loadtxt(file,dtype= str,usecols=(1,)) print(sana) tulostaa ["b A b B b C "] python LueTiedosto1C.py tulostaa [ 1. 2. 3.] [ A B C ] [ 0.54030231-0.41614684-0.9899925 ]
Datan lukeminen Luettava tiedosto Mallidata2.dat muotoa Mallidata2.dat HJD Year M D H M 2454395.96 2007 10 22 10 59 2454399.48 2007 10 25 23 35 2454403.01 2007 10 29 12 11 readline riviltä 3. alkaen 1. kolumnin luvut python LueTiedosto2A.py tulostaa [] [] [2454395.96] [2454395.96, 2454399.48] [2454395.96, 2454399.48, 2454403 date = [2454395.96, 2454399.48, type(date)= <class list > # K o m e n t t i r i v i : Tama on ohjelmani LueTiedosto2A. py import os ; os. system ( clear ) # Tyhjennetaan naytto date = [ ] # Tyhja muuttuja f i l e = open ( M a l l i d a t a 2. dat, r ) # Avaa t i e d o s t o M a l l i d a t a 2. dat r i v i = f i l e. r e a d l i n e ( ) # LUETAAN RIVI KERRALLAAN while ( len ( r i v i ) > 0 ) : # Ei t y h j a r i v i osat= r i v i. s p l i t ( ) # Tyhjien mukaan o s i k s i osa=osat [ 0 ] # 1 a l k i o q=osa. f i n d ( " 245 " ) # E t s i " 2 4 5 " t e k s t i a i f ( q> 1): # Jos l o y t y y..., # String muutetaan desimaaliluvuksi kaskylla " f l o a t " date. append ( f l o a t ( osa ) ) # Lisaa arvo muuttujaan date print ( date ) # Nayta nykyinen date r i v i = f i l e. r e a d l i n e ( ) # Lue seuraava r i v i f i l e. close ( ) # S u l j e M a l l i d a t a 2. dat p r i n t ( " date = ", date ) # T a r k i s t u s p r i n t ( " type ( date )= ", type ( date ) ) # T a r k i s t u s
Datan lukeminen Luettava tiedosto Mallidata2.dat muotoa Mallidata2.dat HJD Year M D H M 2454395.96 2007 10 22 10 59 2454399.48 2007 10 25 23 35 2454403.01 2007 10 29 12 11 readlines riviltä 3. alkaen 1. kolumnin luvut python LueTiedosto2B.py tulostaa [] [] [2454395.96] [2454395.96, 2454399.48] [2454395.96, 2454399.48, 2454403.01] date = [2454395.96, 2454399.48, 2454403 type(date)= <class list > # K o m e n t t i r i v i : Tama on python ohjelmani LueTiedosto2B. py # import os ; os. system ( clear ) # Tyhjennetaan naytto f = open ( M a l l i d a t a 2. dat, r ) # Avaa M a l l i d a t a 2. dat data = f. readlines ( ) # LUETAAN RIVILISTANA f. close ( ) # S u l j e M a l l i d a t a 2. dat date = [ ] # Luo t y h j a l i s t a for r i v i in data : # Looppi datan r i v e i l l e osat= r i v i. s p l i t ( ) # Tyhjien mukaan o s i k s i osa=osat [ 0 ] # 1 a l k i o q=osa. f i n d ( " 245 " ) # E t s i " 2 4 5 " t e k s t i a i f ( q> 1): # Jos l o y t y y..., # String muutetaan desimaaliluvuksi kaskylla " f l o a t " date. append ( f l o a t ( osa ) ) # Lisaa arvo muuttujaan date print ( date ) # Nayta nykyinen date p r i n t ( " date = ", date ) # T a r k i s t u s p r i n t ( " type ( date )= ", type ( date ) ) # T a r k i s t u s
Datan lukeminen Luettava tiedosto Mallidata2.dat muotoa Mallidata2.dat HJD Year M D H M 2454395.96 2007 10 22 10 59 2454399.48 2007 10 25 23 35 2454403.01 2007 10 29 12 11 loadtxt lukee riviltä 3. alkaen 1. kolumnin luvut loadtxt default: dtype= float joten sitä ei tarvitse mainita skiprows=2 ohittaa kaksi ensimmäistä riviä python LueTiedosto2C.py tulostaa date = [ 2454395.96 2454399.48 2454403.01] type(date)= <class numpy.ndarray > [ 0.00415457 0.36557712-0.69084715] # Kommenttirivi : tama on ohjelmani LueTiedosto2C. py # import os ; os. system ( clear ) # Tyhjennetaan n a y t t o import numpy as np # numpy i m p o r t o i t u f i l e = M a l l i d a t a 2. dat # Tiedoston nimi # Komennolla " skiprows =2" jatetaan lukematta 2 ensimmaista r i v i a date=np. l o a d t x t ( f i l e, skiprows =2, usecols = ( 0, ) ) # Lue 1. kolumni p r i n t ( " date = ", date ) # T a r k i s t u s p r i n t ( " type ( date )= ", type ( date ) ) # T a r k i s t u s p r i n t ( np. cos ( date ) ) # T a r k i s t u s date on valmiiksi vektori, josta voi ottaa vaikkapa cosinin
Datan kirjoittaminen (kuva: @quotesgram.com) KirjoitaTiedosto1.py ohjelma kirjoittaa kaksi tiedostoa KirjoitaData1a.dat ja KirjoitaData1b.dat # Komenttirivi : Tama on ohjelmani KirjoitaTiedosto1. py # Kirjoitetaan tiedostoon r i v i kerrallaan # import os ; os. system ( clear ) # Tyhjennetaan naytto import numpy # Importoidaan Numpy x=numpy. arange ( 3. ) ; print ( " x= ",x ) # Luodaan 1 v e k t o r i y=numpy. sin ( x ) ; print ( " y= ",y ) # Luodaan 2 v e k t o r i # # K i r j o i t e t a a n vain l u k u j a f =open ( KirjoitaData1a. dat, w ) # Avaa t i e d o s t o n for i in range ( len ( x ) ) : # f o r l o o p p i f. w r i t e ( " %6.1 f %8.4 f \ n " %( x [ i ], y [ i ] ) ) # K i r j o i t t a a r i v i n f. close ( ) # Sulkee t i e d o s t o n # # K i r j o i t e t a a n l u k u j a j a s t r i n g e j a esim : Latex kayttoon f =open ( KirjoitaData1b. dat, w ) # Avaa t i e d o s t o n for i in range ( len ( x ) ) : # f o r l o o p p i f. w r i t e ( " %6.1 f%3s%8.4 f%4s \ n "%(x [ i ], &, y [ i ], \ \ \ \ ) ) f. close () # Sulkee t i e d o s t o n python KirjoitaTiedosto1.py tulostaa x= [ 0. 1. 2.] y= [ 0. 0.84147098 0.90929743] Alempi tapa käytännöllinen laskuharjoituksissa KirjoitaData1a.dat on muotoa 0.0 0.0000 1.0 0.8415 2.0 0.9093 KirjoitaData1b.dat on muotoa 0.0 & 0.0000 \\ 1.0 & 0.8415 \\ 2.0 & 0.9093 \\
Datan kirjoittaminen KirjoitaTiedosto2.py ohjelma kirjoittaa kaksi tiedostoa KirjoitaData2a.dat ja KirjoitaData2b.dat # Komenttirivi : Tama on ohjelmani KirjoitaTiedosto2. py # Eras nopea tapa k i r j o i t t a a k e r r a l l a k a i k k i data # import os ; os. system ( clear ) # Tyhjennetaan naytto import numpy as np # Importoidaan Numpy x=np. arange ( 3. ) ; p r i n t ( " x= ", x ) # Luodaan 1 v e k t o r i y=np. sin ( x ) ; print ( " y= ",y ) # Luodaan 2 v e k t o r i # np. s a v e t x t ( K i r j o i t a D a t a 2 a. dat, ( x, y ), fmt= %10.3 f ) np. s a v e t x t ( K i r j o i t a D a t a 2 b. dat, np. transpose ( ( x, y, ) ), fmt= %10.3 f ) python KirjoitaTiedosto2.py tulostaa x= [ 0. 1. 2.] y= [ 0. 0.84147098 0.90929743] Tämä yhden rivi komento np.savetxt on käytännöllinen kun tahdotaan kirjoittaa lukuja nopeasti ja helposti tiedostoihin KirjoitaData2a.dat on muotoa 0.000 1.000 2.000 0.000 0.841 0.909 KirjoitaData2b.dat on muotoa 0.000 0.000 1.000 0.841 2.000 0.909