Code Project Bouw een Ncurses UI met Python

Code Project Bouw een Ncurses UI met Python Dit pauzeert uitvoeringCode Project: Bouw een Ncurses UI met Python

Stel je de scène: je bent ingelogd op een server op afstand via SSH, of u een nieuwe videokaart hebt geïnstalleerd en je bent links staren naar de opdrachtregel. Je nodig hebt om een ​​opdracht in te voeren, maar je kan me niet herinneren de zillion opties die mee te gaan met het. Je zit vast – alles wat je kunt doen is te raadplegen van de manual pagina’s en porie door de pagina’s van twijfelen technische abracadabra. We hebben er allemaal geweest, en het maakt niet uit hoe ervaren je bent met Linux, soms moet je snel een baan te bereiken zonder zeven door massa’s van lectuur.

Nu, useradd is een vrij triviaal gereedschap en er is een alternatieve opdracht adduser dat u vraagt ​​stap-voor-stap. Maar hier zullen we u de code en technieken om uw eigen config tools maken het geven – dus op het einde, zult u in staat om gebruiksvriendelijke hulpprogramma’s te schrijven voor het starten, clearing tijdelijke bestanden, of iets anders zou je normaal doet op de shell prompt. Niet alleen zal dit bespaart u tijd van vitaal belang als je op de command line, maar het betekent dat je config gereedschappen voor andere mensen die kunnen inloggen op uw machines te schrijven. Als je een server te draaien en niet wilt dat gebruikers proberen om super-complex commando guesstimate, kunt u elkaar stoot een quick-dialoog gebaseerde versie.


Net als bij onze vorige code projecten (probeer ze – gaan, gewoon met de rechtermuisknop op de link en kies Open Link in New Tab!), Deze handleiding gaat uit van een oppervlakkige kennis van de kennis van programmeren. Maak je geen zorgen: je hoeft niet naar een codering whiz zijn, maar als je rond met een andere taal hebt gespeeld, zul je een vliegende start. Maar zelfs als je nog nooit een regel code geschreven hebt in je leven, hopelijk deze tutorial zal je laten zien hoe programma’s in elkaar passen en wat u kunt doen. Genoeg chit-chat– laten we aan de slag met UserMaster.

Pint-sized Python

We zullen ons project te baseren op Python, een enorm populaire programmeertaal die wordt gebruikt in alles, van kleine scripting tools waarmee volwaardige applicaties. de Anaconda installer is bijna volledig geschreven in de taal: Als je Fedora of Red Hat Enterprise Linux ooit hebt geïnstalleerd, heb je een Python applicatie in al zijn glorie hebben gezien. Python is zalig makkelijk te lezen (misschien wel de meest mens- leesbare Computing Language rond), dus we hoeven niet te detail details van de syntax. Sterker nog, als je een regelmatige Pythoner u kunt overslaan dit stukje. Maar voor een snel overzicht van de taal, voert deze in een tekstbestand en sla het op in je home directory als test.py:

Open nu een terminal en voer:

De Python-interpreter loopt en voert onze code. Hij drukt een string op het scherm, dan voegt samen twee variabelen, en geeft de resultaten. U kunt variabelen bellen bijna alles wat je wilt, mits zij niet in strijd zijn met Python zoekwoorden. Dus hier, x, y en z zijn prima generieke namen variabele. U hoeft geen van beide rond faff met accolades, zoals Python maakt gebruik van inspringen voor code blokken, als volgt:

Hier, verklaren we een subroutine (aka functie) bij het begin – het is niet meteen uitgevoerd, maar alleen als we het noemen. Dus Python slaat over het eerste stuk code, want het is een aparte functie, en begint met de "Roeping" afdrukken lijn. Dan is onze code roept de saysmithers () routine die de afdrukken "Uitstekend" bericht. Code die hoort bij een functie of code blok is gemarkeerd met tab streepjes, zoals je kunt zien uit onze voorbeelden. U kunt parameters thusly doorgeven aan functies:

Dus hier hebben we een functie die alleen spuugt wat tekst die zij ontvangt. Nogmaals, is het niet meteen uit te voeren – want het is een standalone-functie – en code begint bij de eerste niet-functionele lijn. We noemen de saystuff functie twee keer, met verschillende teksten als parameters, en onze functie van de meegeleverde tekst om het scherm drukt gewoon. Super eenvoudig!

Begin vloeken

Voor onze UserMaster tool, willen we niet een saaie command line interface – immers, dat is wat de standaard user management programma’s te gebruiken. In plaats daarvan zullen we een vriendelijker menu en dialoog gedreven interface met behulp van de curses bibliotheek te creëren. Als je nog nooit eerder van gehoord, vloeken is een bibliotheek van routines waarmee u te maken dozen, ramen en tekst-entry panelen op tekst gebaseerde displays. Het is een spel op het woord ‘cursor’, en op moderne Linux-systemen, is de uitvoering ervan meestal aangeduid met ncurses.

In wezen, vervloekt overbrugt de kloof tussen de command line en grafische desktops. In de tekst mode, kun je niet ontelbare kleuren en pixel-perfect besturing van de muis, maar je kunt nog steeds meer dan een reeks letters. vloeken kunt u maken semi-GUI applicaties met ramen en dozen – als je ooit hebt gebruikt de tekst gebaseerde Debian, Ubuntu of Slackware installateurs, je weet wat we bedoelen.

Hier is een voorbeeld. Zoals eerder, raak je deze in een tekstbestand en sla het op in uw home directory als test.py. voer het daarna met python text.py in een terminal:

Python bevat een set van bindingen met de curses bibliotheek – met andere woorden, kunt u de kenmerken van vloeken te gebruiken in uw Python-programma’s, zodat u importeert de vloeken module zoals vermeld in de eerste regel van deze code. De tweede lijn van code wordt een nieuwe vloeken scherm object. Python is een object-georiënteerde taal, dus in dit geval, creëren we een nieuw scherm werkruimte (genaamd Mijn Scherm) en vertel vloeken zichzelf (initscr) initialiseren. Nu hebben we de controle van de terminal venster.

Vervolgens hebben we vier lijnen, die vloeken wat te doen met onze nieuwe Mijn Scherm object vertellen. In de eerste plaats zeggen dat we vloeken om een ​​grens te trekken in de omgeving van ons scherm, die onmiddellijk maakt het er mooier dan een vanille-CLI-programma. In de volgende regel, vertellen we vloeken om tekst toe te voegen aan onze Mijn Scherm object, met vermelding van de plaats waar het moet worden afgedrukt. Normaal gesproken tekst terminals zijn 80×25 karakters als je aan het ruwe Linux terminal, of 80×24 als je in de GUI-modus en hebben gelanceerd xterm, Konsole of Gnome-Terminal. Dus een afdruk van een regel tekst 12 tekens naar beneden en 25 over – het midden van het scherm, tenzij u uw terminal natuurlijk heb verkleind!

De derde regel is erg belangrijk: we moeten refresh beroep doen op onze Mijn Scherm object te vloeken dat we klaar om te gaan vertellen. Hypothetisch, vloeken kon het scherm als voor elke opdracht te vernieuwen, maar dat zeer traag met complexe programma’s zou zijn. Dus in plaats daarvan, laat ons bouwen onze vertoning beetje bij beetje, en dan trek de hele boel in een klap. Calling refresh hier maakt onze grens en tekst om het scherm.

Tot slot hebben we twee overgebleven regels code: de eerste, die getch doet een beroep op onze Mijn Scherm object, vertelt vloeken te wachten op een toetsaanslag (get character). Dit pauzeert uitvoeren totdat we een toets in te drukken. Tot slot noemen we endwin die wordt afgesloten vloeken en brengt ons terug naar onze normale command-line interface. Wanneer u dit programma uitvoert, zult u de resultaten in de eerste screenshot te zien – erg basic, maar nu zijn we klaar om UserMaster schrijven!

Het resultaat van onze Python Ncurses code tot nu toe – het is niet spannend, maar wel de basis voor grotere dingen te vormen!

UserMaster 1.0

Hier is de code voor ons programma. U kunt de source code hier downloaden. maar voor nu, lees net overheen – moet u in staat om te begrijpen wat het doet. Als je Python nog nooit eerder hebt gebruikt, zijn er een aantal nieuwe concepten in hier, maar we zullen gaan over hen in een moment.

Dat is nogal een beetje van de code, maar het grootste deel van het geld wordt besteed omgaan met het scherm, dus het is eigenlijk niet erg ingewikkeld. Het programma start met een menu met vier keuzes:

  1. Voeg een gebruikersaccount
  2. Herstart de Apache webserver
  3. Weergave beschikbare schijfruimte
  4. Uitgang.

Het maakt niet uit als je niet hebt Apache geïnstalleerd – dit is gewoon om te laten zien hoe je het programma uit te breiden naar een meer veelzijdige config tool.

De eerste regel laat ons het programma uit te voeren zonder dat u de Python-interpreter met de hand (python usermaster.py) op te geven. Meer daarover in een moment. Dan hebben we twee import lijnen: de eerste geeft ons toegang tot Python systeem commando, dat ons laat uitvoeren externe programma’s (dwz binaries je zou vinden in / usr / bin etc), terwijl de tweede rollen in vloeken zoals hiervoor beschreven.

Vervolgens hebben we twee functies. De eerste neemt een prompt tekenreeksparameter, en dan vraagt ​​de gebruiker om een ​​koord alvorens terug te keren het terug. Kortom, in de menselijke-speak, het zegt, "Vertel me wat vragen op het scherm te zetten, dan zal ik wat tekst van de gebruiker te krijgen en terug te sturen." We maken gebruik van deze functie later in de code om informatie voor het useradd commando te krijgen.

De tweede functie Ondertussen voert een opdracht op het systeem. Het duurt een string parameter, wist het scherm, en daarna voert de opdracht in deze lijn:

Nu, wat is dat daar? Nou, we willen weten of de opdracht succesvol is uitgevoerd. Wanneer we gebruik maken van Python systeem routine om een ​​programma uit te voeren, geeft 0 als het programma met succes liep, of een ander nummer als het een fout opgetreden. Dankzij dit, kunnen we een boodschap af te drukken om aan te geven of de opdracht gewerkt – bijvoorbeeld, of door de gebruiker toe te voegen proces is gelukt of mislukt. Later, kunt u UserMaster uit te breiden naar andere taken, waarvan sommige geen zichtbare uitvoer te genereren doen (bijvoorbeeld het uitvoeren van een cron job), maar je zult nog steeds weten of het werkte of verknald.

Dus, deze twee functies de basis te leggen voor onze OS. Python start het programma uitvoert op x = 0 lijn, die net stelt een variabele voor de volgende regel, die controleert of x bevat het karakter 4. Goed, in dit stadium, hebben wij hebben een ingang van de de gebruiker nog – maar we zullen in een paar stappen. We vuur van ncurses, schakelt het scherm, een grens en vervolgens afdrukken enkele opties strings naar het scherm. Dan hebben we:

De gebruiker heeft een lijst van commando’s om uit te kiezen; wat hij / zij binnenkomt wordt opgeslagen in de variabele x. Dus, het volgende als regels controleren om te zien wat er in x: als het ene, we zijn in de gebruiker toe te voegen mode; als het 2, we herstart Apache; 3, en laten we schijfruimte; 4, en we sluiten. Maar wacht eens even, waar gaan we controleren op 4 daar? Nou ja, we doen dat aan het begin van de lus, in deze lijn:

Indien de gebruiker iets anders dan 1, 2 of 3 binnenkomt, springt de besturing terug naar de tijd lijn, die dan stopt het uitvoeren codeblok. Zoals eerder vermeld, zijn code blokken in Python gemarkeerd met tab streepjes, dus na ons programma heeft gedaan controleren op de 3-toets in te drukken, gaat het terug naar het begin van de lus – terwijl lijn. Het doet dit omdat het volgende (en laatste) lijn, de endwin (), is niet ingesprongen en dus geen deel uit van de while-lus code blok. Dus het einde van de streepjes geeft aan waar de code blok eindigt.

Geen buts, alleen ifs

Laten we eens kijken naar die if statements. Afhankelijk van wat de gebruiker heeft ingevoerd, lopen we een bepaald programma met behulp van onze execute_cmd () functie. Voor de opties 2 en 3, we gewoon vloeken uit te schakelen (zodat het niet interfereert met ons programma output), en dan start het programma. execute_cmd () vertelt ons wanneer het programma correct uitgevoerd, voor het overhandigen controle terug naar de belangrijkste code – dus we zien het menu weer.

Maar het is de eerste optie, dat is het meest interessant. Hier gebruiken we onze functie funky get_param () om een ​​reeks van aanwijzingen te geven, het krijgen van input van de gebruiker elke keer. We vragen de gebruiker een accountnaam, standaard shell, enzovoort; niets te belasten. Dan sluiten we ons aan al deze stukjes informatie bij elkaar en voer ze naar standaard useradd commando van het systeem, met de juiste command-line parameters (bijvoorbeeld -d voor home directory). Daarom is dit de reden waarom de execute_cmd () lijn is hier erg lang – het voegt zich samen al de snaren en vlaggen die het commando nodig heeft om te werken.

Pak usermaster.py. kopiëren naar je home directory, dan is het vuur van een terminal en overstap naar root (sudo bash in Ubuntu of su in anderen). Enter:

Wanneer u een gebruiker hebt gemaakt via onze tool, moet u ook het opzetten van een wachtwoord als volgt:

Vervang nate met de gebruikersnaam die u hebt gemaakt. Om de code listing kort te houden, hebben we niet deze faciliteit in UserMaster, maar het is een ideale eerste mini-project voor u: het toevoegen van een wachtwoord instellen / wijzigen faciliteit! Je zou hoeft alleen maar een andere optie toe te voegen aan het menu, krijgt de accountnaam via een get_param () call, dan voeren passwd op die naam.

De exacte details van gebruikers en groepen en hoe ze gerelateerd zijn verschilt heel duidelijk van Linux distributie tot distributie, dus je wilt op maat UserMaster voor uw eigen behoeften. Als je normale gebruikersaccount, voert groepen in een terminal om te zien welke groepen een standaard gebruiker behoort, en zie ook de useradd handleiding (man useradd) voor meer informatie over de opties die we buis om de opdracht te leren.

Het cultiveren van vloeken

In deze tutorial gebruiken we een aantal van vloeken meest voorkomende routines – het wissen van het scherm, het tekenen van een grens, het krijgen van ingang enz. Maar het is nog veel meer in staat dan dat, het verstrekken van een complete set van het venster beheer routines. Ja, het lijkt zinloos om het concept van ramen in een tekst terminal, maar het laat je te maken en te verwijderen panelen (bijv vraag dialogen), terwijl de tekst onder intact. U kunt zelfs interface met de muis in X-terminals!

Vervelend, documentatie voor de Python bindings vervloekt is nogal vaag op dit moment; de officiële Python documentatie heeft slechts een kort hoofdstuk over de bibliotheek en er is niet veel anders te doen de ronde. Wilt u meer doen met vloeken, uw beste inzet is het Linux Documentatie Project Ncurses Programmering How To – het werd oorspronkelijk geschreven met C programmeurs in het achterhoofd, maar je zult veel van dezelfde functie oproepen in de Python bindings te vinden.

Bron: www.tuxradar.com

Leave a comment

Your email address will not be published.


*


vijf + zeventien =