<> == System operations == {{{ #!/usr/bin/env python import glob import os import shutil import stat import subprocess as sub import sys #======================================================================+ # | # Methods introduced here are parts of the glob, os, sys, shutil, and | # subprocess modules. The main purpose of these modules are to perform | # system information tasks, system management, and file and directory | # handling. | # | # For further information and good introduction see the following links: # | # http://docs.python.org/library/glob.html | # | # http://docs.python.org/library/os.html | # popen has been depricated; use subprocess instead | # | # http://docs.python.org/library/shutil.html#module-shutil | # | # http://docs.python.org/library/subprocess.html | # | # http://docs.python.org/library/sys.html | # | #======================================================================+ #======================================================================+ # | # The sys module provides access to some variables used or maintained | # by the interpreter and to functions that interact strongly with the | # interpreter. | # The most important method for me is sys.exit() | # | #======================================================================+ sys.exit('\n This exits the program.\n') # This exit may be intercepted which I have not had a need for so far. # provides a list of strings specifying the search path for modules. sys.path() #======================================================================+ # | # The os module provides a portable way of using operating system | # dependent functionality. | # I seem to use os.path.exists and os.system most often | # | #======================================================================+ path = os.getcwd() print path os.uname() os.path.exists(path) os.path.isdir(path) os.path.isfile(path) os.chdir('/home/mib') os.getcwd() os.chdir(path) os.getcwd() os.chmod(path+'/seminar4.py', 0777) cmd = 'ls -l ' + path+'/seminar4.py' os.system(cmd) os.chmod(path+'/seminar4_mib.py', stat.S_IRWXU) os.system(cmd) newpath = 'test/nextlevel' cmd = 'ls -l ' +newpath os.system(cmd) # this command works recursively and creates the complete structure os.makedirs(newpath) os.rmdir(newpath) # this command does not work recursively and in this case only throws an error message os.mkdir(newpath) os.rmdir(newpath) # a much more elaborate and safer way of creating a directory # Notice: the try ... except construct is a very powerful and helpful way in python to handle exceptions # it should actually be preferred to the if ... else construct where possible try: os.makedirs(newpath) except OSError: if os.path.isdir(newpath): pass else: # There was an error on creation, so make sure we know about it raise # or using an if construct (maybe more intuitive): if not os.path.exists(newpath): os.makedirs(newpath) #======================================================================+ # | # Maybe the most interesting method is os.system. However, this method | # only returns the exit status of the command to be executed. Up to | # python 2.5, there was the os.popen method which allowed for a bit | # more communication between the python script and the system command | # but is deprecated now. | # Since python 2.6 a much more powerful and flexible, and hence a bit | # more complicated, way of handling system commands is provided by the | # subprocess module. | # | #======================================================================+ process = sub.Popen('ls -l asdf', shell=True, executable='/bin/bash', stdout=sub.PIPE, stderr=sub.PIPE) communicate = process.communicate() if communicate[1] != '': sys.exit('\nAn error has occured: %s' % (communicate[1])) else: listing = communicate[0].split('\n') print listing # Notice: the string formatting syntax %s is a very powerful and helpful tool !!! # the correct way of getting a file listing is to use the glob method of the glob module: # very helpful and I use it regularly in my scripts listing = glob.glob('*.py') print listing #======================================================================+ # | # The shutil module offers a number of high-level operations on files | # and collections of files. In particular, functions are provided which| # support file copying and removal. For operations on individual files,| # see also the os module. | # | #======================================================================+ # !!! Always use shutil methods instead of os.system('cp src dest') !!! os.makedirs('temp/') shutil.copy2('seminar4.py', 'temp/seminar4.py') # with error handling included: # this does not work now: os.makedirs('temp/') # instead use this # Nice tip: If you want to paste the following passage to ipython then you will get # a indentation error. The right way to do it is to use the magic function %cpaste! try: os.makedirs('temp/') except: if os.path.isdir('temp/'): # if a dir named temp/ already exists delete it and create it anew try: os.rmdir('temp/') # does not work if dir is not empty except OSError: shutil.rmtree('temp/') # removes the complete tree os.makedirs('temp/') else: # if another error was raised let me know about it raise }}} == The Python Debugger: pdb == {{{ #!/usr/bin/env python # -*- coding: utf-8 -*- import numpy as np import pdb #======================================================================+ # | # It is a very good idea to use a debugger when developing program | # source code - no matter which language is used. For python there is | # the python debugger pdb. | # Its documentation can be found here: | # | # http://docs.python.org/library/pdb.html | # | #======================================================================+ # import pdb # pdb.set_trace() # where you want the program to stop and the debugger # to start then use the pdb commands to debug your code # If you run a script in ipython and uncaught exception occurs, you can use # the ipython magic %debug to start the pdb and examine the problem. # Alternatively, if you switch using the pdb on with calling %pdb once at # the beginning, ipython will automatically start the debugger on any # uncaught exception. # With the following script the usage of the pdb is illustrated. def main(): ''' this is my main program''' # With the following script the usage of the pdb is illustrated. array = np.loadtxt('DE-Hai.2005.synth.hourly.allvars.csv', delimiter=',', usecols=(0,1,2,3), skiprows=1) a = array[:,1] pdb.set_trace() b = array[:,6] for i in range(len(array[:,3])): array[i,3] = 3. print 'das wärs' if __name__ == '__main__': main() }}}