Dr.Paneas Δημοσιεύτηκε Μάϊος 31, 2008 #1 Κοινοποίηση Δημοσιεύτηκε Μάϊος 31, 2008 Τι γινετε οταν μπορειτε να συνδιασετε την δυναμη της python και του bash ;Τα πραγματα ειναι αρκετά ενδιαφέροντα, αφού χρήστης έχει την δυνατότητα να γράψει δικά του python scripts που θα τον βοηθήσουν στην λειτουργια του λειτουργικού του συστήματος. Για παράδειγμα αν εχει καποες καθημερινες λειτουργιες, όπως πχ να κανει update το apt-get να, να βλεπει mails, να . να .. να ... να ...Αντι να θυμαται απέξω ολες τις εντολες στην κονσολα, θα μπορει το κανει ευκολα και γρήγορα με εναν δικο του πινακα ελεγχου. Πχ οτι θελει να προσθετει χρητες, και δεν θυμαται την εντολη που ειναι ενα μακαρονι απο εδω εως την αλλη ακρη του post αυτου, τοτε μπορει να αυτοματοποιησει την διαδικασια με ενα script. Τετοια script ειναι κυριολεκτικα γεματο το linux ειτε με perl ειτε με python ειτε με C. Μερικα απο αυτα εχουν γινει πολυ διασημα, όπως για παραδειγμα το envy που κανει εγκατασταση τους drivers για την καρτα γραφικων σας. Μπορειτε να γραψετε και εσεις το δικο σας script και ετσι που ξερετε, μπορει να ειναι τοσο καλο και χρησιμο που να σας κανει υπερηφανους μια μερα.Λοιπον, τι χρειαζετε να ξερετε: python και bash commands.Γι αυτο το post τα παραδειγμα που θα κανω δεν ειναι τιποτα το ιδιατερο οποτε εισαι Οκ με λιγες γνωσεις.Δηλαδη και να μην ξερετε python, και να ξερετ καποια αλλη γλωσσα δεν υπαρχει προβλημα θα την εξηγησω λιγο εδω, σρκει ομως να μην ειστε τελειος ασχετος απο προγραμματισμο γιατι τοτε δεν θα καταλαβετε τιποτα.Λοιπόν παμε να μαθουμε λιγο python.Καταρχας κατεβαστε την οσοι δεν την εχετε με την εντοληsudo apt-get install python ή ψαξε την στο Synaptic.Ανοιξτε ενα terminal και δωσε python.panos@panos-laptop:~$ pythonPython 2.5.1 (r251:54863, Oct 5 2007, 13:36:32) [GCC 4.1.3 20070929 (prerelease) (Ubuntu 4.1.2-16ubuntu2)] on linux2Type "help", "copyright", "credits" or "license" for more information.>>> Θα δειτε λογικο το παραπανω ^^^^Αυτο ειναι ενα interactive interpreter. οτι εντολη γραφετε την εκτελει αμεσως.,Πχ δωσε: print "thelab rocks"Στην python δεν υπαρχουν curly braces να ξεχωριζουν ποτε τελειωνει και ποτε αρχιζει ενα code blockαλλα το κανετε εσεις με το tab space.πχ μια function αρχιζει με την λεξη def και στο τελος εχει ανωκατω τελειαdef function_name(parameters): blah_blah blah blahΟι συνθηκε ελεγχου με το κλασσικο if statement υλοποιειται παλι ετσι μονο που μπαινει και μια λεξουλα που λεγεται ord οταν το x ειναι τυπου char, και παραλειπεται οταν ειναι αριθμος.πχif x == ord('2'): blah blahelse: blah blahκαι τωρα που πειρατε μια γευση απο υλοποιηση συντακτικου ας κανουμε ενα παραδειγμα:>>> def thelab(x):... if x == 1:... print "TheLab.gr rocks"... else:... print "TheLab.gr sucks"... >>> thelab(1)TheLab.gr rocks>>> thelab(0)TheLab.gr sucks>>> Αυτα νομιζω αρκουν. Αχ εχετε καποιες αλελς αποριες υπαρχει και το google.====================================================Για να γραψουμε τα προγραμματα μας και να φαινονται ομορφα θα κανουμε χρηση της βιβλιοθηκης ncurses. Ετσι οχι οτι θα εχουμε τιποτα τρελα γραφικα αλλα μια πιο ομορφη κονσόλα.Ανοιξτε πχ το kate ή το gedit γραφοντας kate example.pyπρώτα απο ολα θα γράψετε την παρακατω γραμμή έτσι ώστε να μπορείτε να εκτελείτε το προγραμμα σας καθολικά μέσα απο το sbin (θα σας πω στην πορεια) #!/usr/bin/env pythonΔεύτερον για να συνδιάσετε εντολές από το /usr/bin στο προγραμμά σας δώστε: from os import systemΤώρα ήρθε η ώρα να αρχικοποιησουμε τις ncurses οποτε γράφουμε: import curses=========================================================================Ας υποθεσουμε τωρα οτι θελουμε εναπρογραμμα που θα μας λεει πληροφοριες του cpu.αυτο υπαρχει ομως, γραφοντας cat /proc/cpuinfo οποτε θα με ρωτησετε ποιος ο λογος να γραψω ενα προγραμμα που θα κανει το ιδιο ;Μπορειτε να γραψετε λοιπον μια συλλογη απο προγραμματε για συντομευσεις, δηλαδη πατωντας το ενα να παιζει το ταδε, προγραμμα, πατωντας το 2, παιζει το αλλο. ή για παραδειγμα να κανετε αναζητηση στο cat /proc/cpuinfo ετσι ώστε να σας εμφανίζει μόνο αυτά που θέλετε (πχ με τη νεντολη cat /proc/cpuinfo | grep cpu )Οποτε εγω θα σας φτιαξω ενα απλο τετοιο προγραμμα και μετα εσεις μπορειτε να κανετε οτι θελετε παραπανω. Απλα για παρετε μια γεύση, πως υλοποιειτε κατι τετοιο.=========================================================================Φανταστείτε οτι γραφετε C++ και οτι το παρακατω ειναι ειναι η main σαςx = 0 while x != ord('2'): # Όσο το χ δεν ειναι 2 screen = curses.initscr() # δημιουργει ενα instance της class curses με constructor την τιμη του initscr() screen.clear() # Αφου έχει φτιαχτεί το περιβάλλον ncurses, το περνάει ένα καθάρισμα screen.border(0) # Περίγραμμα με μια γραφή για πιο όμορφο ντεκόρ screen.addstr(2, 2, "Please enter a number") #εκτυπωνει το string στην οθόνη με συντεταγμένες x=2, y =2 screen.addstr(4, 4, "1 - Daily Tasks") screen.addstr(5, 4, "2 - Exit") screen.refresh() #Για να εμφανιστού όλα τα παραπάνω κάνουμε refresh x = screen.getch() # Αποθηκεύει την επιλογή μας (1,2,3) κάτι σαν το cin της C++ ή το scanf της C if x == ord('1'): #Αν έχετε δώσει 1 νωρίτερα curses.endwin() #Καταρχάς κλείσε το τρέχον curses παράθυρο (την δινω παντα πριν απο μια εντολη system) system("clear") # η εντολή clear του linux - καθαρίζει το console - terminal a = system("sudo apt-get update") #η κλασσικη εντολή της οποια το αποτελεσμα το βαζω στο α για ελεγχο αργοτερα print " " if a == 0: #Ο ελεγχος που σας ελεγα print "Command Executed" else: print "Command Faild" raw_input("Press Enter") #Κάτι σαν το system("PAUSE") αν έχετε ακουστά print " " system("clear") #αφού τελειώσα την δουλειά μου, κανω και ένα clear curses.endwin() #κλείνω και το παραθυρο και ταυτοχρονα και το προγραμμαΓια να δωσετε λοιπον εντολη του συστημα γράφετε system("blah-blah-blah-blah")Για να κανουμε τώρα ενα βημα παραπανω, και να φτιάξουμε μια function να κανει αυτην δουλεια. Δηλαδη είδαμε οτι για να εκτελεσουμε μια εντολή απο το συστημα πρέπει να κάνουμε τα εξής βήματα:1)curses.endwin() #Καταρχάς κλείσε το τρέχον curses παράθυρο (την δινω παντα πριν απο μια εντολη system)2)system("clear") # η εντολή clear του linux - καθαρίζει το console - terminal3)a = system("η εντολή") #η κλασσικη εντολή της οποια το αποτελεσμα το βαζω στο α για ελεγχο αργοτερα4)print " " #για ομορφια5)if a == 0: #Ο ελεγχος που σας ελεγα print "Command Executed" else: print "Command Faild"6)raw_input("Press Enter") #Κάτι σαν το system("PAUSE") αν έχετε ακουστά7) print " " #για ομορφιαΠάμε λοιπόν να ξαναγράψουμε το ίδιο:#!/usr/bin/env pythonfrom os import systemimport cursesdef execute_cmd(cmd_string): system("clear") a = system(cmd_string) #θα πάρει την εντολή από το κύριο πρόγραμμα print " " if a == 0: print "Command Executed" else: print "Command Faild" raw_input("Press Enter") print " "x = 0 while x != ord('2'): screen = curses.initscr() screen.clear() screen.border(0) screen.addstr(2, 2, "Please enter a number") screen.addstr(4, 4, "1 - Daily Tasks") screen.addstr(5, 4, "2 - Exit") screen.refresh() x = screen.getch() if x == ord('1'): curses.endwin() execute_cmd("sudo apt-get update") # το sudo apt-get install ειναι στο cmd_string στην περιπτωση αυτη system("clear") curses.endwin()=========================================================================Τι γίνετε όμως όταν θέλετε να κάνετε μια εντολη interactive ;Ας φτιαξουμε μια function που εμφανιζει την ερωτηση στον χρηστη και ταυτοχρονα επιστρέφει και το input που έδωσε ο χρηστης.Ειμαστε λοιπον στο σημειο όπου ρωταει το προγραμμα:1 - Αυτο 2- Μηπως Αυτο3 - exitΕμεις θέλουμε για παραδειγμα, αν πατησει το 1.Να του γινει μια ερωτηση και να πληκτρολογισει ο user την απαντηση.Πχ να του ρωτηση ποιο ειναι το username ;Αυτος να το γραψειΚαι μετα να εχουμε ενα προγραμμα που θα κανει πχ ls usernameΑυτο εννοω interactiveΟποτε αυτη η function αφου θελουμε να εκτυπωνει το μυνημα που θα ρωταει κατι σιγουρα θα το παιρνει ως παραμετρο.Μετά θελουμε να καθαριζει την οθονη, να φτιαχνει παλι το ντεκορ οπως ηταν και να εμφανιζονται ολα αυτα οπως και πρινΝα εμφανιζει την ερωτηση-παραμετροΝα διαβαζει την απαντηση του χρηστηΝα επιστρεφει την απαντησηΠάμε λοιπον:def get_param(prompt_string): screen.clear() # καθαρίζει το screen απο το 1 - Αυτο, 2 - Μηπως αυτο, 3 - exit και οτι ντεκορ ειχαμε κλπ κλπ screen.border(0) #ξανα βαζει το πλαισιο ντεκορ screen.addstr(2, 2, prompt_string) #ρωτάει τον χρήστη screen.refresh() #Εμφανιζει ολα τα παραπανω ^^^^ στην οθονη, γιατι αν το γραψετε, δεν βλεπετε τιποτα input = screen.getstr(10, 10, 60) # διαβαζει την απαντηση του χρηση με συντεταγμενες x=10, y=10, και η απαντηση 60χαρακτηρων return input #επιστρεφει το inputΑυτη ειναι η function μας. Μεσα στην "main" θα εκχωρειτε σε μια μεταβλητη που θα αναφερετε λογικα στην ερωτηση, πχusername = get_param("Enter the username")Τοσο απλό.Η φράση enter the username ειναι το prompt_string. Εμφανιζετε στην οθονη.Πληκτρολογει ο χρηστης την απαντηση, και αυτη επιστρεφετε και αποθηκευεται στην μεταβλητη username------Ας γράψουμe λοιπον ένα τελικο script που θα εχει και τις δυο functions μεσα#!/usr/bin/env pythonfrom os import systemimport cursesdef get_param(prompt_string): screen.clear() screen.border(0) screen.addstr(2, 2, prompt_string) screen.refresh() input = screen.getstr(3, 2, 60) return inputdef execute_cmd(cmd_string): system("clear") a = system(cmd_string) print "" if a == 0: print "Command Executed" else: print "Command Faild" raw_input("Press Enter") print ""x = 0 while x != ord('2'): screen = curses.initscr() screen.clear() screen.border(0) screen.addstr(2, 2, "Please enter a number") screen.addstr(4, 4, "1 - Open Firefox") screen.addstr(5, 4, "2 - Exit") screen.refresh() x = screen.getch() if x == ord('1'): url = get_param("Please enter the URL eg www.thelab.gr ") curses.endwin() execute_cmd("firefox " + url) #ο interactive συνδιασμος system("clear") curses.endwin()==================================Σε εισαγωγικα δινουμε την εντολη και ενα κενο πριν το τελευταιο γιατι αλλιως θα εκτελεσει firefoxwww.thelab.gr - δηλαδη μια μπουρδα. Μετα γραφουμε + την παραμετρο που θελουμε.Καντε save ως fifis.py στο home directory σας.Για να μην δινετε συνεχεια python fifis.py αλλα να δινετε fifis και να τρεχει σαν προγραμμα τότε:panos@panos-laptop:~$ sudo -iroot@panos-laptop:~# cd /home/panosroot@panos-laptop:/home/panos# chmod +x fifis.pyroot@panos-laptop:/home/panos# mv fifis.py /usr/sbin/fifisroot@panos-laptop:/home/panos# fifisπροσοχη οταν κανετε chmod το + και το x ειναι ειναι ενωμενα χωρις κενο ενδιαμεσα τους.Αυτα για σήμερα! Link to comment Share on other sites More sharing options...
chek2fire Ιούνιος 1, 2008 #2 Κοινοποίηση Ιούνιος 1, 2008 Μπράβο!! Link to comment Share on other sites More sharing options...
Dr.Paneas Ιούνιος 1, 2008 Author #3 Κοινοποίηση Ιούνιος 1, 2008 Ευχαριστω, να σαι καλα φιλε μου. Link to comment Share on other sites More sharing options...
eleozz Ιούνιος 2, 2008 #4 Κοινοποίηση Ιούνιος 2, 2008 :clap::clap::clap::clap:Μπράβο πολύ καλος Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.