stl michael poeltl © 2010, 2011, 2013 |
Ist schon seit langem ein fixer Bestandtil der python Standard Library.
Es ist eine portable API von system services. Vor allem ist es aber dazu da, OS-unabhängigen code zu schreiben (was manchmal als Middleware bezeichnet wird), also code, der unter Linux genauso lauffähig ist, wie unter MacOS. Das Modul hat mehr als 200 Klassen/Methoden, Funktionen, Konstanten, und sonstige identifier.
>>> import os >>> print( os.sep, os.pathsep, os.pardir, os.curdir, os.linesep, ) ('/', ':', '..', '.', '\n') >>>
Unter MacOSx oder MSWindows würde die Ausgabe anders aussehen, zum Beispiel, Backslash als Verzeichnistrenner.
os.sep
zeigt den Verzeichnistrenner an, os.pathsep
zeigt an, mit welchem Zeichen Verzeichnisangaben, zum Beispiel in der PATH-Variablen, getrennt werden sollen (PYTHONPATH), os.pardir
und os.curdir
gibt die Symbole fürs aktuelle und fürs übergeordnete Verzeichnis aus, und os.linesep
das Zeichen für den Zeilenumbruch. Gerade der Zeilenumbruch ist ein klassisches Beispiel dafür, wie sich die OS's voneinander unterscheiden. \n ist das Zeilenende (Zeilenumbruch) in Unix/Linux, \r\n ist der Zeilenumbruch unter MSWindows und \r ist der Zeilenumbruch in MacOSx.
Würde man MacOSx ein file mit dem Zeilenumbruch von Linux (\n) geben, dann könnte der Zeilenumbruch nicht erkannt werden, und das Textfile würde unter MacOS als eine lange Zeile dargestellt werden.
Natürlich bietet os mehr als das.
>>> os.getcwd() '/home/poeltl' >>> adir = '/tmp/mydir' >>> os.mkdir(adir) >>> os.listdir(adir) >>> os.mkdir(adir+'/eins') >>> os.listdir(adir) ['eins'] >>> os.stat(adir) posix.stat_result(st_mode=16877, st_ino=2572L, st_dev=2050L, st_nlink=3, st_uid= 1000, st_gid=100, st_size=4096L, st_atime=1286341007, st_mtime=1286341004, st_ct ime=1286341004) >>> os.rename(adir+'/eins', adir+'/eins_renamed') >>> os.listdir(adir) ['eins_renamed'] >>> os.rmdir(adir+'/eins_renamed') >>> os.listdir(adir) [] >>>
So!
Kurz einmal Luft holen!
jetzt, beim zweiten Mal hinschauen, erkennt man, dass die Zeilen selbsterklärend sind.
>>> os.getlogin() 'poeltl' >>> print( os.getgroups() ) >>> print( os.getgroups() ) [4, 6, 20, 24, 46, 100, 105, 119, 122, 1000] >>> os.getloadavg() (0.0, 0.0, 0.0) >>> print( os.getppid(), os.getpid(), ) >>> print( os.getppid(), os.getpid(), ) (1917, 1918) >>> os.chdir ('/usr') >>> os.getcwd() '/usr' >>> print( os.environ.keys() ) ['PROMPT_COMMAND', 'LESS', 'MINICOM', 'LESSOPEN', 'SSH_CLIENT', 'CVS_RSH', 'LOGN AME', 'USER', 'INPUTRC', 'PATH', 'PS2', 'QTDIR', 'PS1', 'LS_OPTIONS', 'LANG', 'K DEDIR', 'TERM', 'SHELL', 'SHLVL', 'WORK', 'G_BROKEN_FILENAMES', 'WINDOW', 'EDITO R', 'MANPATH', 'PYTHONPATH', 'JAVA_HOME', 'HOME', 'DIR_STACK', 'WORTE', 'VISUAL' , 'T1LIB_CONFIG', 'PKG_CONFIG_PATH', 'BASE_WORKDIR', 'STY', '_', 'TERMCAP', 'SSH _CONNECTION', 'XDG_CONFIG_DIRS', 'GDK_USE_XFT', 'SSH_TTY', 'LC_COLLATE', 'HOSTNA ME', 'CPLUS_INCLUDE_PATH', 'HISTCONTROL', 'PYTHONSTARTUP', 'PWD', 'MAIL', 'LS_CO LORS'] >>> 'HOME' in os.environ True >>> os.getenv('HOME') '/home/poeltl' >>> for dir in os.environ['PATH'].split(os.pathsep): ... print (dir) ... /local/itsme/work/bin /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin /usr/games >>> #pfad zu dir/file, auf das symbolic-link zeigt >>> print( os.readlink('/usr/bin/python') ) python2.6 >>> print( os.readlink('/usr/local/bin/python') ) Traceback (most recent call last): File "<stdin>", line 1, in >module> OSError: [Errno 2] No such file or directory: '/usr/local/bin/python' >>> print( os.readlink('/usr/local/bin/python3-config') ) python3.2-config >>> os.get_terminal_size() os.terminal_size(columns=80, lines=23) >>> tsize = os.get_terminal_size() >>> tsize.columns 80 >>> tsize.lines 23 >>> tsize[1] 23 >>>
Ich bekam bei der ersten readlink-Abfrage eine OsError-Exception, da /usr/local/bin/python auf meiner slackware-box ein binary, und eben kein symbolischer link auf ein binary war.
/usr/local/bin/python3-config
IST ein symbolischer link, und es wird somit das binary ausgegeben, auf das der link zeigt.
Das Setzen von Shell-Umgebungsvariablen in einem python-Programm hat für alle danach ausgeführten Programme Gültigkeit. Gleich ein erstes Beispiel dazu:
>>> import subprocess >>> subprocess.call('cat /home/poeltl/tmp/checkenv.sh', shell=True) #! /bin/bash echo "$DAUGHTER2" 0 >>> subprocess.call('/home/poeltl/tmp/checkenv.sh', shell=True) margret 0 >>> os.environ['DAUGHTER2'] = 'maggie' >>> subprocess.call('/home/poeltl/tmp/checkenv.sh', shell=True) maggie 0 >>>
>>> groesse = os.path.getsize('/etc/services') >>> print (groesse) 18832 >>> file = 'services' >>> dir = '/etc' >>> path = os.path.join(dir, file) >>> print (path) /etc/services >>>
Wie der Name schon vermuten läßt, wandert
os.walk() durch ein Verzeichnis. Es gibt ein generator-Objekt zurück.
>>> testwalk = os.walk('/etc') >>> type(testwalk) <type 'generator'> >>> print (testwalk.__next__()) ... <lange Ausgabe> ...
testwalk zeigt auf ein generator-Objekt; nach testwalk.__next__() wird der erste Schritt ins Startverzeichnis /etc
gemacht, und ein Tuple mit drei Elementen kommt zum Vorschein. Dieses wiederum besteht aus: