Izvršavanje Python programa

5.3.1 Izvršavanje Python programa

Problem: Hej, dosta svalopeva za Windows korisnike... Ja koristim Linux, Kako JA da brže pokrećem svoj program? Zar je moram uvek da koristim terminal?
Odgovor: Evo i za tebe par saveta koji važe samo ukoliko si Linux i Unix korisnik (ali ako si i korisnik Windows-a trebalo bi da „baciš oko“ na ovo). 
Tvoj problem je, ako sam dobro razumeo, što svaki put, kada želiš da pokreneš svoj Python program, moraš ga pozivati naredbom python3 ime_programa.py, i ideja je da ga pokrećemo kao i svaki drugi program koji se nalazi na tvom računaru? To i nije neki problem! Za to nam pomaže nešto što se naziva hashbang linija
I ona izgleda ovako:
#!/usr/bin/env python3 
Prva oznaka u liniji je #! - što je specijalni znak koji govori operativnom sistemu da je ovo fajl koji treba da izvrši neki drugi program, što je u našem slučaju Python3.
Ono što dolazi posle ovog specijalnog znaka je – naziv programa. Mogli smo jednostavno da napišemo Python3, ali možda nismo sigurni da li sistem zna šta je Python3 (obično zna, ali, jedan od zadataka programera je i da  predvidi sve moguće probleme koji se mogu desiti, i ako se mogu desiti onda će se i, po Marfijevim zakonima – desiti! A, kako bi korisnici reagovali kada bi im prodali nešto što je neispravno?)? Da bi smo izbegli tu „zamku“ pametnije je postaviti putanju prema mestu gde se nalazi instaliran program (u većini slučajeva /usr/bin/python3). Ali, avaj....  Imaš mušteriju koja ima super-sigurne servere, i koji je spreman da ti plati milione za program koji treba da radi na svima njima, a – ne radi na polovini. Hvata te za gušu, i naravno, hoće svoje pare nazad! Šta se desilo? Pa, napravio si čestu programersku grešku koja se naziva hardcoding, tj ubacio si link u program, ka mestu koje je možda prisutno. Tvoja mušterija, na žalost, ima instaliran Python u /usr/sbin (zarad sigurnosti), te tvoj program ne radi, jer ne može da nađe pokretač (Python3).
No, zato postoji i ovaj trik: /usr/bin/env – ova putanja daje sistemu znak koji kaže – uzmi program koji je negde instaliran, a ti ga inače koristiš! Na ma treba Python3, pa je, u stvarnom životu /usr/bin/env python3 ekvivalent rečenici: „daj mi Python3, ma gde si ga zaturio!“.
Na kraju je naša linija: #! /usr/bin/env python3
Ova linija se dodaje u program, na taj način da je napišemo kao prvu liniju u skripti. Dakle, izmenimo naš program da izgleda ovako: 
#! /usr/bin/env python3 
print("Hello World!") 
print('Pozdrav Svima') 
print("Šta se radi?") 
print('Kako si?') 
print("Što si me, malo pre, zeznuo?") 
print("A znaš da imam tako nežno srce...") 
print("Obećaj da ćeš me slušati ubuduće!") 
input('''Hvala što ste koristili Vaše slobodno vreme. 
Pritisni Enter za izlaz.''')
Ali..... Opet ne radi....
'~/moji_programi/prvi_program.py' 
bash: /home/stara_kanta/moji_programi/prvi_program.py: Permission denied 
Kao što vidiš, operativni sistem te je upozorio da tvoj program nema dozvolu da se izvrši, jer, ko zna šta je u njemu i koliko može da naškodi samom sistemu? Ovo je jednostavno – stvar sigurnosti – sistem obično ne čini korake koji mu mogu naškoditi, obično mu to radi korisnik.
Znači, ti moraš dati dozvolu programu da se izvršava. To je lako: koristićeš chmod komandu! 
chmod komanda se ovde koristi za promeni ponašanje datoteke u sistemu, za sada ona je običan tekstualni fajl, a dajući joj dozvolu da se izvršava – on postaje program! Pa hajde da obavimo to: 
$ chmod a+x prvi_program.py 

Pažnja!

Ovom komandom smo svima dozvolili da koriste naš fajl kao program! To je zato što smo napisali a+x, gde je a oznaka za sve koji imaju pristup računaru, i x – mogu da pokreću program. Šta misliš, da li je to sigurnosni propust? Šta ako tvoj program radi automatsko iščitavanje lozinki svih korisnika, a neki haker se „prikači“ i jednostavno ga pokrene?
Možda je pametnije dati dozvolu samo trenutnom korisniku (koji se predstavlja slovom u, umesto slova a), pa u tom slučaju komanda izgleda ovako:
$ chmod u+x prvi_program.py
Hah, ali sada samo taj jedan korisnik može da pokreće program... I to je jedna od večitih dilema: sigurnost ili rasprostranjenost? Odgovor ne postoji... Svako se ophodi prema onome kako on misli da treba, tako da, iskustvo stekni praksom!
Bilo kako bilo, sada možeš pokrenuti program kao i bilo koji drugi koji si pokretao do sada, jer sad tvoj operativni sistem poziva /usr/bin/env što će pronaći naš Python 3 program, i pri tom ima „zeleno svetlo“ (dozvolu) za rad.
$ ./prvi_program.py
Hello World! 
Pozdrav Svima 
Šta se radi? 
Kako si? 
Što si me, malo pre, zeznuo? 
A znaš da imam tako nežno srce... 
Obećaj da ćeš me slušati ubuduće! 
Hvala što ste koristili Vaše slobodno vreme. 
Pritisni Enter za izlaz. 
Ups...Koristim oznaku ./ da bi kazao operativnom sistemu da se program nalazi u trenutnoj fascikli. To nije baš željeno ponašanje? Zaboravi na trenutak gde si stao, ovde počinje mala zabava! Probaj da promeniš ime svog programa tako da bude samo prvi_program (znači, samo mu obriši ekstenziju) i pokušaj sad da ga pokreneš ovako: ./prvi_program . Wow! Program i dalje radi! 
Šta to znači? Ekstenzija nije bitna?!?
Ne, to zavisi od operativnog sistema i/ili grafičkog okruženja, ako koristiš terminal u Linux-u (ili ostalim Unixolikim sistemima) zaista i nije! Tvoj sistem zna da mora da pokrene program pomoću interpretera čija si lokaciju naveo u prvom redu u fajlu. Ajde promeni naziv u prvi_program.pdf. Da li još uvek radi? Wow! Fantazija!
Još više zabave može da ti pričini i ovo – idi preko GUI fajl menadžera u folder u kom ti je program. Opa... Vidi vidi, ikonica govori da je to – pdf fajl! Dvoklik – otvara se program koji služi za pregled pdf dokumenata i – izbacuje grešku.... Hehe, sistem se – zbunio?!? (zapravo nije sistem, samo jedan njegov deo zadužen za GUI i pokretanje programa iz njega, kao što vidiš, u terminalu te sistem još uvek sluša.)
Ajd mu sad promeni ime u prvi_program.avi... Probaj da ga pokreneš iz terminala, radi? Naravno... U GUI-ju? Pokazuje da je to video fajl? Dvoklik... Radi? Probaj.... pa mi kaži :P
Iza ovog simpatičnog primera se krije jedna zaista ozbiljna filozofija, o kojoj malko treba da razmisliš. Iskusan programer neće „slepo“ verovati svojim čulima, jer eto, video si – to je video fajl sto posto, ali nije bio..., već će se isključivo voditi zdravom logikom i testiranjima (testiranje je proces izazivanja greške – ako postoji makar jedan slučaj u kome neki deo programa ne radi ispravno, onda ili ispravljaj ili batali, u svakom slučaju, ne sme da izađe u javnost, jer je neispravan! Velike kompanije troše milionske iznose samo na testiranje softvera, pa sad ti vidi koliko je to važno!). 
Tako isto je i u realnom životu: verovatno si makar jednom u životu se zadivio nekom mađioničaru i njegovim trikovima. I verovatno si se uvek zapitao: „Kako? Kako je to uspeo, malopre je bilo tamo, sada ovde...?“. I onda te još neki Pametnjaković Džunior posavetuje „otvori četvoro očiju“... Ako se nikad nisi upoznavao sa sistemom rada „magije“, ti je gledaš, i ništa ne vidiš, pa, pošto se ne razumeš u materiju, opet budeš obmanut, ovog puta, od strane svog mozga, jer će on „računati“ po logici na kojoj je navikao u svojoj svakodnevici (i, hehehe, najčešće i ne može da se nazove „logika“, više je to „inercija“!), i koji će te ubediti da si video ono što – zapravo i nisi, pa ćeš čak moći da vidiš.... ili osetiš.... ili čuješ (zavisi od čula koje je „prevareno“), ko zna šta.... i ko zna kakav zaključak može izaći iz svega toga (verovatno ćeš posle predstave čuti gomilu ljudi kako oduševljeno komentarišu, i svi daju neku svoju predstavu o tome šta su videli, a možda se i posvađaju oko „oprečnih stavova“, ali, bože moj... svako ima pravo na svoje mišljenje, ma koliko je to mišljenje u stvari – pogrešno). No, za svaki slučaj, posle predstave obrati pažnju na džepove – verovatnoća da ih je Pametnjaković Džunior ispraznio je srazmerna njegovom „prijateljskom“ zalaganju da ti objasni da je trik u rukama mađioničara koji drži novčić koji nestaje, govoreći - „Evo gledaj, sada sledi prevara, sad će ovo da uradi, pazi šta ti kažem!!!“.
I, pošto mi pokušavamo da naučimo magiju zvanu programiranje, manimo se ovakvih malih trikova...
Vreme je da se vratimo našem problemu, i da ga rešimo jednom za svagda...
Do sada si bio u mogućnosti da pokreneš svoj program samo ako znaš njegovu tačnu lokaciju. Većina programa sa kojima si se susretao se ne ponaša na taj način. Znači mi želimo da pokrenemo program iz komandne linije, bez komande cd, bez „bauljanja“ kroz fajl sistem, bez nagađanja.... Jednostavno – želimo da pokrenemo program bilo kada i bilo gde, bez preteranog lupanja glavom!
To možemo da postignemo ako sačuvamo naš program u jednom od foldera koji su navedeni u PATH promenljivoj okruženja sistema.
Dža, Bu? Šta to pričaš? Jel to Kineski jezik? 
Izvini, evo kratkog objašnjenja: kada pokrećeš bilo koji program, koji si instalirao ili sam napisao, sistem ga traži u direktorijumima koji su navedeni u PATH promenljivoj okruženja, a kad ga nađe pokreće ga (da li ti se čini sličnim onim što smo radili kada smo instalirali Python?). Dolazimo do zaključka da jednostavnim kopiranjem našeg programa u jedan od tih direktorijuma navedenih u PATH-u rešavamo problem! 
$ echo $PATH 
/usr/lib/lightdm/lightdm: /usr/local/sbin: /usr/local/bin: /usr/sbin: /usr/bin: /sbin: /bin: /usr/games 
echo $PATH nam je dao spisak direktorijuma, kopirajmo fajl u neki (cp komanda na linuksu kopira fajl, a sudo je komanda koja ti daje maksimalne dozvole)...
$ sudo cp prvi_program  /usr/games
$ sudo prvi_program
Hello World! 
Pozdrav Svima 
Šta se radi? 
Kako si? 
Što si me, malo pre, zeznuo? 
A znaš da imam tako nežno srce... 
Obećaj da ćeš me slušati ubuduće! 
Hvala što ste koristili Vaše slobodno vreme. 
Pritisni Enter za izlaz. 
Budući da smo ovim samo „zakomplikovali“ stvari, jer nam sad treba i lozinka svaki put prilikom pokretanja, šta da radimo, a da bude pametno?
Ako si dovoljno iskusan, primetio si gde sam prethodno pogrešio – izašao sam iz „sigurne“ zone mog korisnika (što mu dođe njegov Home folder), pa je sistem odlučio da me „muči“ (sa njegove tačke stanovišta, on se samo štiti, jer šta ja imam da tražim na tom mestu?). Hajde da se vratimo u svoju „sigurnu zonu“, a da sve radi onako kako smo i zamislili.
Ako bih želeo da dodam neki svoj direktorijum u PATH promenljivu, - to mogu jako jednostavno da postignem kucajući:
export PATH=$PATH:/home/maj_komp/moji_programi
pri čemu je '/home/maj_komp/moji_programi' folder u kom čuvam svoje projekte i koji želim da dodam u PATH promenljivu sistema.
Uh.... Teško? Pa jeste, ako nisi znao, no ako znaš jednu „ekstra“ informaciju, cela ova „zajebancija“ gubi smisao. Naime Unixoliki sistem će, prilikom svog pokretanja, pitati PATH da mu pokaže direktorijume u kojima su programi, a PATH će, automatski, „za svaki slučaj“ (što se kaže) proveriti i svaki Home – da li u njemu ima /bin direktorijum!!!! Znači – jednostavno možeš u svome Home-u kreirati folder koji ćeš nazvati bin i – nema zime! Kada završiš svoj program i on postigne svoju punu funkcionalnost, daš mu dozvole, i posle toga, samo ga prebaciš na to mesto i – fura mašina!
Ove metode su veoma korisne ako želiš da pišeš komande da bi ih mogao pokrenuti bilo kada, bilo gde, slično kao što je korišćenje naredbe cd , mkdir, zip ili bilo koje druge koju koristiš u terminalu!

5.3 Kreiranje izvorne
datoteke
Indeks 5.4 Pronalaženje
pomoći

Primjedbe

Popularno

Kako televizija štetno utiče na Vaše zdravlje finansije?

Da li je TV kviz Slagalica "prevara"?

Tu je novi Qt creator 4.4.0!

Kada prijatelji odlaze

Microsoft objavio - nova verzija Windowsa stiže...

Sitnije promene na blogu...

Opet su se pojavili lažni kuponi brenda "IDEA" na društvenim mrežama

Poslednji pozdrav izgubljenom vremenu

Sistemska greška

Fake poet