Dr.Paneas

Python + ncurses + bash

Recommended Posts

Τι γινετε οταν μπορειτε να συνδιασετε την δυναμη της 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:~$ python
Python 2.5.1 (r251:54863, Oct  5 2007, 13:36:32) 
[GCC 4.1.3 20070929 (prerelease) (Ubuntu 4.1.2-16ubuntu2)] on linux2
Type "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 blah
else:
            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 - terminal

3)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 python
from os import system
import curses
def 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 python
from os import system
import curses
def get_param(prompt_string):
   screen.clear()
   screen.border(0)
   screen.addstr(2, 2, prompt_string)
   screen.refresh()
   input = screen.getstr(3, 2, 60)
   return input

def 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 -i
root@panos-laptop:~# cd /home/panos
root@panos-laptop:/home/panos# chmod +x fifis.py
root@panos-laptop:/home/panos# mv fifis.py /usr/sbin/fifis
root@panos-laptop:/home/panos# fifis

προσοχη οταν κανετε chmod το + και το x ειναι ειναι ενωμενα χωρις κενο ενδιαμεσα τους.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now