sys – kapcsolat az oprendszerrel


Warning: file_get_contents(http://pythonlib.pergamen.hu/examples/sys_egy_objektumra mutato_hivatkozasok_megszamlalasa.py) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in /home1/nagitaco/public_html/pythonlib/wp-content/plugins/pythonlib/pythonlib.php on line 26

Warning: file_get_contents(http://pythonlib.pergamen.hu/examples/sys_egy_objektumra mutato_hivatkozasok_megszamlalasa.out) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in /home1/nagitaco/public_html/pythonlib/wp-content/plugins/pythonlib/pythonlib.php on line 62

Ez a modul a Python futásidejű környezettel való kommunikációra, annak lekérdezésére és módosítására szolgál

A parancssori paraméterek használata

Az argv lista tartalmazza a programnak átadott paramétereket – ebbÅ‘l a nulladik a futtatott program neve.

A program paramétereinek kiolvasása

# File: sys_program_parameterek_hasznalata_01.py

import sys

print "A futtatott program neve:", sys.argv[0]

if len(sys.argv) > 1:
    print "Kaptunk ", len(sys.argv)-1, "parametert:"
    for arg in sys.argv[1:]:
        print arg
else:
    print "Nincsenek tovabbi parameterek!"
# File: sys_program_parameterek_hasznalata_01.out

A futtatott program neve: J:\htdocs\Py_LIB_site\examples\sys_program_p
arameterek_hasznalata_01.py
Nincsenek tovabbi parameterek!

Ha a program a szabványos bemenetről származik, pl.

python < sys-argv-example-1.py

, a program neve üres karakterlánc lesz.

A modulok használata

A path lista tartalmazza azokat a könyvtárneveket, ahol a Python modulokat keres (Python nyelvű modulok, lefordított modulok vagy bináris kiegészítéseket). Ez a lista több beépített szabály alapján keletkezik a Python indításakor, a PYTHONPATH környezeti változóból és Windows-on a registry tartalmából. Mivel a path lista egy teljesen szokványos lista, módosítani tudod őket a programodból:

A modulok keresési útvonalának módosítása a sys modullal

# File: sys_modulok_keresesi_utvonalanak_modositasa.py import sys print "A path lista ", len(sys.path), "elembol all" # egy konyvtar hozzaadasa a modulok keresesi utvonalahoz sys.path.insert(0, "teszt") try: import teszt_modul # a modul kiirja, hogy SZIA KEDVES OLVASO print "az importalas sikerult" except: print "az importalas nem sikerult" # kitoroljuk a listat sys.path = [] # a Python sajat random moduljat SEM tudjuk importalni, mert a lista teljesen ures. import random # hopsza!
# File: sys_modulok_keresesi_utvonalanak_modositasa.out

A path lista 13 elembol all
Szia kedves olvaso!
az importalas sikerult
Traceback (most recent call last):
 File "H:\htdocs\Py_LIB_site\examples\sys_modulok_keresesi_utvona
lanak_modositasa.py", line 18, in ?
import random # hopsza!
ImportError: No module named random

A Python értelmezőbe beépített modulok megkeresése

# File: sys_beepitett_modulok_megkeresese.py import sys # print sys.builtin_module_names def dump(module): print module, "=>", if module in sys.builtin_module_names: print "Beepitet modul!" else: # az __import__ utasitas hivodik meg, amikor az import-ot hasznaljuk. # module = __import__(module) print "nincs benne a beepitett modulok listajaban, file: ", print module.__file__ return module dump("os") dump("sys") dump("string") dump("strop") module = dump("zlib") print "erdekesseg - milyen tulajdonsagai vannak egy modul objektumnak?" print dir(module) # itt a __XX__ tipusu objektumtulajdonsagok 'gyari' modul tulajdonsagok.
# File: sys_beepitett_modulok_megkeresese.out

os => nincs benne a beepitett modulok listajaban, file: C:\Python24
\lib\os.pyc
sys => Beepitet modul!
string => nincs benne a beepitett modulok listajaban, file: C:\Pyth
on24\lib\string.pyc
strop => Beepitet modul!
zlib => nincs benne a beepitett modulok listajaban, file: C:\Python
24\DLLs\zlib.pyd
erdekesseg - milyen tulajdonsagai vannak egy modul objektumnak?
['DEFLATED', 'DEF_MEM_LEVEL', 'MAX_WBITS', 'ZLIB_VERSION', 'Z_BEST_COM
PRESSION', 'Z_BEST_SPEED', 'Z_DEFAULT_COMPRESSION', 'Z_DEFAULT_STRATEG
Y', 'Z_FILTERED', 'Z_FINISH', 'Z_FULL_FLUSH', 'Z_HUFFMAN_ONLY', 'Z_NO_
FLUSH', 'Z_SYNC_FLUSH', '__doc__', '__file__', '__name__', '__version_
_', 'adler32', 'compress', 'compressobj', 'crc32', 'decompress', 'deco
mpressobj', 'error']

Az importált modulok kilistázása

A modules szótár minden betöltött modult tartalmaz. Az import utasítás ellenőrzi ezt, mielőtt bármit is betöltene.

A következő példában jól látható, hogy a Python a program indítása előtt jópár modult előre betölt:

# File: sys_importalt_modulok_kilistazasa.py

import sys

# a pelda windows-on futott le
print sys.modules.keys()
# File: sys_importalt_modulok_kilistazasa.out

['copy_reg', 'locale', '__main__', 'site', '__builtin__', 'encodings.c
p1250', 'encodings', 'os.path', 'encodings.codecs', 'ntpath', 'UserDic
t', 'encodings.exceptions', 'nt', 'stat', 'zipimport', 'warnings', 'en
codings.types', '_codecs', 'sys', 'codecs', 'types', '_locale', 'signa
l', 'linecache', 'encodings.aliases', 'exceptions', 'os']

Egy objektumra mutató hivatkozások megszámlálása

A getrefcount függvény az objektumra mutató hivatkozások számával tér vissza - vagyis hogy hány helyen használják a hivatkozáslekérdezés pillanatában az objektumot. Ha ez az érték 0-ra csökken, az objektum megsemmisül. FONTOS: ez az érték mindig magasabb, mint a valós hivatkozásszámláló értéke, mert maga a lekérdezési folyamat is használja - s így növeli - a változó értékét.

# File: sys_egy_objektumra mutato_hivatkozasok_megszamlalasa.py

# File: sys_egy_objektumra mutato_hivatkozasok_megszamlalasa.out

Az operációs rendszer kilétének megállapítása

A sys.platform változó az oprendszer azonosítóját tartalmazza. A Windows alapú rendszerek neve win32, a Macintosh azonosítója mac. A Unix rendszerek változatosabbak: irix6, linux2, vagy unos5 (Solaris), vagy egyéb...

# File: sys_milyen_oprendszeren_fut_a_program.py import sys # az "import os.path" utanzasa pathmodule = "-" if sys.platform == "win32": import ntpath pathmodule = ntpath elif sys.platform == "mac": import macpath pathmodule = macpath else: # ha nem a fenti ketto, feltelelezzuk hogy ez egy posix platform import posixpath pathmodule = posixpath print pathmodule
# File: sys_milyen_oprendszeren_fut_a_program.out

<module 'ntpath' from 'C:\Python24\lib\ntpath.pyc'>

A szabványos bemenet és kimenet használata

A szabványos bemenet átirányítása a kimenetre, módosítással

# File: sys_szabvanyos_bemenet_atiranyitasa_kimenetre.py

#! /bin/python.exe
import sys

for line in sys.stdin:
    # a bemenetet soronkent a kimenetre irjuk:
    sys.stdout.write(line.upper())
# File: sys_szabvanyos_bemenet_atiranyitasa_kimenetre.out

$ echo 'vadalma' | sys_szabvanyos_bemenet_atiranyitasa_kimenetre.py
VADALMA

A szabványos bemenet, kimenet vizsgálata - mi micsoda, mi történik valójában?

A helyzet az, hogy e sorok írásakor az effbot.org-on lévő példát én sem értettem, mármint hogy pontosan mi mit csinál - ezért szétszedem, megvizsgálom - hogy megértsem. (ui: a példa végiggondolása és feldolgozása után már értem, hogy mi történik. B.)

# File: sys_szabvanyos_bemenet_kimenet_vizsgalata.py import sys import string def azonositas(objektum, objektum_nev): print "%s" % objektum_nev, "id:", id(objektum) class Atiranyitas: def __init__(self, stdout): self.stdout = stdout print "Atiranyitas parameterkent kapott sys.stdout id-je:", id(self.stdout), "\n" def write(self, s): self.stdout.write(string.upper(s)) # a szabvanyos kimenet atiranyitasa (igy a print utasitase is!) old_stdout = sys.stdout azonositas(old_stdout, "old_stdout") azonositas(sys.stdout, "sys.stdout") # a ket azonositas kimeneten lathato, hogy ugyanaz az id-juk, ugyanarra az objektumra hivatkozik a ket nev. sys.stdout = Atiranyitas(sys.stdout) azonositas(sys.stdout, "sys.stdout, Redirect utan") print "Piroska es a farkas", print "Fanni kedvenc meseje", "\n"*2 # restore standard output sys.stdout = old_stdout print "Micimacko!" # ami tortent: a sys.stdout-nak van egy write metodusa. # csinaltunk egy uj objektumot, aminek ugyanolyan write metodusa van - # es a sys.stdout-ra torteno kesobbi hivatkozasok valojaban az uj objektumra mutatnak, # ami feldolgozza a kapott adatokat, es a VALODI SYS.STDOUT-NAK TOVABBITJA-TOVABBITHATJA oket.
# File: sys_szabvanyos_bemenet_kimenet_vizsgalata.out

old_stdout id: 10215528
sys.stdout id: 10215528
Atiranyitas parameterkent kapott sys.stdout id-je: 10215528 
SYS.STDOUT, REDIRECT UTAN ID: 10645952
PIROSKA ES A FARKAS FANNI KEDVENC MESEJE 
Micimacko

Kilépés a programból: sys.exit()

Egy program futását a sys.exit() függvénnyel lehet megszakítani.

A függvénynek opcionális paraméterként egy szám adható, mely visszaadódik a hívó programnak. A kilépő kódokról részletes leírás olvasható itt.

# File: sys_exit_kilepes_a_programbol.py

import sys

print "szia"

sys.exit(1) # kilepes, a hivo program 1-es visszateresi erteket kap.
# a 0 kilepesi ertek rendszerint normalis (nem hiba miatti) programfutas befejezest jelent

print "ez mar nem nyomtatodik ki"
# File: sys_exit_kilepes_a_programbol.out

szia

A sys.exit() kivételdobásának elkapása

Az előző példa nem emeli ki, de a sys.exit() a kilépést nem a program azonnali abbahagyásával éri el - valójában SystemExit kivételdobás történik. Ez viszont - a többi kivételdobáshoz hasonlóan, elkapható.

# File: sys_exit_kiveteldobasanak_elkapasa.py

import sys

print "szia"

try:
    sys.exit(1)     # itt kiveteldobas tortenik, amit az except azonnal elkap
except SystemExit:
    print "SystemExit kiveteldobas tortent"           

print "Es meg ez is kinyomtatodik - vagyis a program futasa NEM ert veget a sys.exit()-nel!"
# File: sys_exit_kiveteldobasanak_elkapasa.out

sziaSystemExit kiveteldobas tortent
Es meg ez is kinyomtatodik - vagyis a program futasa NEM ert veget a s
ys.exit()-nel!

Kilépőfüggvény készítése

# File: sys_kilepo_fuggveny_keszitese.py

import sys

def kilepeskor_teendok():
    print "takaritok, atmeneti munkafajlokat torlom, figyelmezteto mailt kuldok"

sys.exitfunc = kilepeskor_teendok

print "Szia"
sys.exit(1)
print "ez soha nem lesz kinyomtatva"
# File: sys_kilepo_fuggveny_keszitese.out

Sziatakaritok, atmeneti munkafajlokat torlom, figyelmezteto mailt kuld
ok

A 2.0-ás Pythontól kezdődően az atexit modullal több kilépő függvényt is készíthetsz.

Post Comments

You must be logged in to post a comment.