stl michael poeltl © 2010, 2011, 2013

Das os-Modul

os

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
>>>

os.path

>>> groesse = os.path.getsize('/etc/services')
>>> print (groesse)
18832
>>> file = 'services'
>>> dir = '/etc'
>>> path = os.path.join(dir, file)
>>> print (path)
/etc/services
>>>

os.walk()

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 /etcgemacht, und ein Tuple mit drei Elementen kommt zum Vorschein. Dieses wiederum besteht aus:


Hier geht es zum Seitenanfang und da geht es zur Startseite meiner python-Zusammenfassung