OS Module¶
Indices and tables¶
Introduction¶
Sometimes, OS dependent functionality is required by your application, module or function. To expose this in a platform agnostic way, Python provides the os module.
The following examples are a non-exhaustive list of functionality available in the os module.
There is no coverage of the process management functions that are part of the os module as it is better to work with processes using the subprocess module.
Accessing Environment Variables¶
The os.environ dictionary can be used to add, get and delete environment variables:
>>> #
>>> # Fetch all environment variables
>>> #
>>> os.environ
environ({'PYTHONSTARTUP': '/etc/pythonstart', 'PYTHONPATH': '/opt/pycharm/pycharm-2017.3, 'HOST': 'mike-dt', 'LANGUAGE': 'en_US'})
>>> #
>>> # Set a (possibly new) environment variable
>>> #
>>> os.environ['new_var'] = "foobar"
>>> os.environ
environ({'new_var': 'foobar', 'PYTHONSTARTUP': '/etc/pythonstart', 'PYTHONPATH': '/opt/pycharm/pycharm-2017.3, 'HOST': 'mike-dt', 'LANGUAGE': 'en_US'})
>>> #
>>> # Getting an environment variable
>>> #
>>> os.environ['new_var']
'foobar'
>>> #
>>> # Removing an environment variable
>>> #
>>> del os.environ['new_var']
If the environment variable requested doesn’t exist, os.environ will return a KeyError. To get around this, you can use the os.getenv() function which takes a default value to return if the key doesn’t exist:
>>> # Continuing our example above
>>> #
>>> # Fetch an environment variable that doesn't exist
>>> #
>>> os.getenv('foobar', 'I_DONT_EXIST')
'I_DONT_EXIST'
Tip
The os module also has the os.putenv() function to add environment variables, and os.unsetenv() to delete them. However, these functions do not update os.environ so it is preferable to use os.environ directly.
Getting User and Group Information¶
Simple “get” functions are provided to retrieve basic user, group and process IDs:
>>> os.getlogin()
'mike'
>>> os.getgid()
100
>>> os.getuid()
1000
>>> os.getpid()
13286
If you have permissions on the system to do it, you can also change the GID, UID and umask using the following functions:
Working With Directories¶
>>> #
>>> # Get the current working directory
>>> #
>>> os.getcwd()
'/home/mike/gitsandbox/pythonedu-2017'
>>> #
>>> # Change to a different directory
>>> #
>>> os.chdir('/home/mike/gitsandbox')
>>> os.getcwd()
'/home/mike/gitsandbox'
>>> #
>>> # List the contents of a directory
>>> #
>>> os.listdir()
['pythonedustudent.bitbucket.org', 'pythonedu-2017']
Tip
Be sure to checkout the glob module. Similar to os.listdir() it allows you to get a directory listing. However, it also supports recursive searching and it allows you to filter the results so only items that match a given pattern are returned.
>>> #
>>> # Create a directory
>>> #
>>> os.mkdir('new_dir')
>>> os.listdir()
['new_dir', 'pythonedustudent.bitbucket.org', 'pythonedu-2017']
>>> #
>>> # Make multiple nested directories
>>> #
>>> os.makedirs('a/b/c')
>>> os.listdirs()
['a', 'new_dir', 'pythonedustudent.bitbucket.org', 'pythonedu-2017']
>>> os.listdirs('a')
['b']
>>> os.listdirs('a/b')
['c']
>>> #
>>> # Rename a directory
>>> #
>>> os.rename('new_dir', 'new_dir2')
>>> os.listdirs()
['a', 'new_dir2', 'pythonedustudent.bitbucket.org', 'pythonedu-2017']
>>> #
>>> # Remove a directory
>>> #
>>> os.rmdir('a/b/c')
>>> os.rmdir('a/b')
>>> os.rmdir('a')
>>> os.rmdir('new_dir2')
>>> os.listdir()
['pythonedustudent.bitbucket.org', 'pythonedu-2017']
Working with files¶
>>> #
>>> # Status of the file
>>> #
>>> os.stat('README.md')
os.stat_result(st_mode=33188, st_ino=8652074, st_dev=2051, st_nlink=1, st_uid=1000, st_gid=100, st_size=561, st_atime=1517362573, st_mtime=1517362570, st_ctime=1517362570)
>>> #
>>> # Change the permissions on the file
>>> #
>>> os.chmod('README.md', 0o644)
>>> #
>>> # Change the file owner (change the uid and gid values)
>>> #
>>> os.chown('README.md', 1003, 100)
>>> #
>>> # Change the root directory of the current process
>>> # :NOTE: This creates a chroot jail for security
>>> #
>>> os.chroot('/opt/my_program')
>>> #
>>> # Create a hard link to a file
>>> #
>>> os.link('README.md', 'my_link')
>>> os.listdir()
['.git',
 'my_link',
 'README.md']
>>> #
>>> # Rename a file
>>> #
>>> os.rename('my_link', 'link_by_new_name')
>>> os.listdir()
['.git',
 'link_by_new_name',
 'README.md']
>>> #
>>> # Remove a file
>>> #
>>> os.remove('link_by_new_name')
>>> os.listdir()
['.git',
 'README.md']