16. Anexă
*********


16.1. Modul interactiv
======================


16.1.1. Tratarea erorilor
-------------------------

When an error occurs, the interpreter prints an error message and a
stack trace. In interactive mode, it then returns to the primary
prompt; when input came from a file, it exits with a nonzero exit
status after printing the stack trace. (Exceptions handled by an
"except" clause in a "try" statement are not errors in this context.)
Some errors are unconditionally fatal and cause an exit with a nonzero
exit; this applies to internal inconsistencies and some cases of
running out of memory.  All error messages are written to the standard
error stream; normal output from executed commands is written to
standard output.

Tastând *caracterul de întrerupere* (de obicei, "Control-C" ori
"Delete") a execuției, fie la promptul primar fie la cel secundar, vom
produce oprirea introducerii de caractere de la tastatură și revenirea
la promptul primar. [1] Dacă tastăm caracterul de întrerupere în timp
ce se derulează vreo execuție de comandă, atunci va fi lansată o
excepție "KeyboardInterrupt", a cărei interceptare poate fi
proiectată, de dumneavoastră înșivă, cu ajutorul unei instrucțiuni
"try".


16.1.2. Scripturi Python executabile
------------------------------------

În sistemele Unix de tip BSD, scripturile Python pot fi transformate
în scripturi executabile direct, aidoma scripturilor interpretorului
de comenzi activ în sesiunea de terminal, prin inserarea liniei de cod

   #!/usr/bin/env python3.5

chiar la începutul scriptului, respectiv adăugând permisiunilor
fișierului în care ați introdus scriptul și permisiunea ca acesta să
poată fi executat (ceea ce înseamnă a-i atribui fișierului un *mod
executabil*). Evident, am presupus că variabila de mediu "PATH" din
contul dumneavoastră de utilizator conține (și) calea de acces către
interpretor. Este necesar ca simbolul bi-semn "#!" să fie așezat chiar
la începutul fișierului. Pe anumite platforme, primul rând trebuie să
se termine cu un caracter de încheiere de rând în stil Unix (adică,
"'\n'") și nu cu cele două caractere (invizibile) care desemnează, în
Windows, sfârșitul unui rând ("'\r\n'"). Nu uitați că *diezul*,
denumit, în jargon informatic, caracter *hash*, "'#'", este
întrebuințat în Python la începerea unui comentariu (de un rând).

Pentru ca un script să primească un *mod executabil*, adică pentru a i
se da *permisiunea* de a fi executat, vom folosi comanda **chmod**.

   $ chmod +x myscript.py

În sistemele Windows nu există acest "mod executabil". Instalatorul de
Python va realiza automat asocierea fișierelor ".py" cu "python.exe",
așa că, printr-un clic dublu pe  un (simbol grafic al unui) fișier
Python, acesta va rula ca script. Dacă facem uz de extensia ".pyw" (în
locul lui ".py"), atunci fereastra terminalului, care apare la orice
execuție de script, va fi suprimată.


16.1.3. Fișierul de pornire pentru sesiunea interactivă
-------------------------------------------------------

Atunci când utilizați Python-ul în modul interactiv, este convenabil
să aveți la îndemână un set de comenzi tipice, care să fie executate
ori de câte ori porniți interpretorul. Puteți realiza așa ceva
atribuindu-i unei variabile de mediu cu numele "PYTHONSTARTUP" drept
valoare numele fișierului în care ați introdus setul respectiv de
comenzi. Un atare procedeu seamănă cu cel datorită căruia preparați
conținutul fișierului de configurare (la nivel de cont de utilizator)
".profile" al interpretoarelor de comenzi din sistemele Unix.

Fișierul (de pornire; de la englezescul, ca jargon informatic,
*startup file*) va fi citit doar când deschideți o sesiune de lucru
interactiv, nu și atunci când Python-ul își citește comenzile dintr-un
fișier, și nici atunci când "/dev/tty" este sursa explicită a
comenzilor (fișier care, altminteri, se comportă precum o sesiune
interactivă). Execuția comenzilor din fișier va avea loc în același
spațiu de nume unde se execută comenzile date interactiv, deci
obiectele definite ori importurile făcute de comenzile din fișier vor
putea fi utilizate fără *nume calificate* în timpul sesiunii
interactive. De asemeni, puteți schimba promptul principal  "sys.ps1"
și promptul secundar "sys.ps2" în acest fișier de pornire.

Dacă doriți să fie citit și un fișier de pornire adițional, situat în
directorul curent, atunci puteți realiza acest lucru introducând în
fișierul de pornire global un fragment de cod aidoma acestuia: "if
os.path.isfile('.pythonrc.py'): exec(open('.pythonrc.py').read())". De
asemeni, dacă sunteți interesați să întrebuințați fișierul de pornire
într-un script, atunci va fi nevoie să îi adăugați acelui script un
fragment de cod asemănător celui care urmează:

   import os
   filename = os.environ.get('PYTHONSTARTUP')
   if filename and os.path.isfile(filename):
       with open(filename) as fobj:
           startup_file = fobj.read()
       exec(startup_file)


16.1.4. Module de personalizare
-------------------------------

Python provides two hooks to let you customize it: "sitecustomize" and
"usercustomize".  To see how it works, you need first to find the
location of your user site-packages directory.  Start Python and run
this code:

   >>> import site
   >>> site.getusersitepackages()
   '/home/user/.local/lib/python3.5/site-packages'

Calea de acces fiind găsită, vom crea un fișier denumit
"usercustomize.py" în directorul respectiv și vom introduce în fișier
comenzile dorite. Existența acestui fișier va influența toate
invocările Python-ului, cu excepția situației în care pornirea se va
face cu opțiunea "-s", opțiune care dezactivează importurile automate.

"sitecustomize" works in the same way, but is typically created by an
administrator of the computer in the global site-packages directory,
and is imported before "usercustomize".  See the documentation of the
"site" module for more details.

-[ Note de subsol ]-

[1] O anumită defecțiune din pachetul GNU Readline ar putea să
    împiedice aceasta.
