Python

Aus brainelectronics Wiki
Wechseln zu: Navigation, Suche

Es empfieht sich immer pip installiert zu haben!!!

Coding Stlye

David Goodger in Code Like a Pythonista describes the PEP 8 recommendations as follows:

  • joined_lower for functions, methods, attributes, variables
  • joined_lower or ALL_CAPS for constants
  • StudlyCaps for classes
  • camelCase only to conform to pre-existing conventions
Type Public Internal
Packages lower_with_under
Modules lower_with_under lower_with_under
Classes CapWords _CapWords
Exceptions CapWords
Functions lower_with_under() _lower_with_under()
Global/Class Constants CAPS_WITH_UNDER _CAPS_WITH_UNDER
Global/Class Variables lower_with_under _lower_with_under
Instance Variables lower_with_under _lower_with_under (protected) or __lower_with_under (private)
Method Names lower_with_under() lower_with_under() (protected) or __lower_with_under() (private)
Function/Method Parameters lower_with_under
Local Variables lower_with_under

Python Guideline Colorado Edu recommends The first line of each file shoud be #!/usr/bin/env python. This makes it possible to run the file as a script invoking the interpreter implicitly, e.g. in a CGI context.

Next should be the docstring with a description. If the description is long, the first line should be a short summary that makes sense on its own, separated from the rest by a newline.

All code, including import statements, should follow the docstring. Otherwise, the docstring will not be recognized by the interpreter, and you will not have access to it in interactive sessions (i.e. through obj.__doc__) or when generating documentation with automated tools.

Import built-in modules first, followed by third-party modules, followed by any changes to the path and your own modules. Especially, additions to the path and names of your modules are likely to change rapidly: keeping them in one place makes them easier to find.

Next should be authorship information. This information should follow this format

__author__ = "Rob Knight, Gavin Huttley, and Peter Maxwell"
__copyright__ = "Copyright 2007, The Cogent Project"
__credits__ = ["Rob Knight", "Peter Maxwell", "Gavin Huttley",
                    "Matthew Wakefield"]
__license__ = "GPL"
__version__ = "1.0.1"
__maintainer__ = "Rob Knight"
__email__ = "rob@spot.colorado.edu"
__status__ = "Production"
  

Status should typically be one of "Prototype", "Development", or "Production". __maintainer__ should be the person who will fix bugs and make improvements if imported. __credits__ differs from __author__ in that __credits__ includes people who reported bug fixes, made suggestions, etc. but did not actually write the code.

Example of module structure:

#!/usr/bin/env python
"""Provides NumberList and FrequencyDistribution, classes for statistics.

NumberList holds a sequence of numbers, and defines several statistical
operations (mean, stdev, etc.) FrequencyDistribution holds a mapping from
items (not necessarily numbers) to counts, and defines operations such as
Shannon entropy and frequency normalization.
"""

from math import sqrt, log, e
from random import choice, random
from Utils import indices

__author__ = "Rob Knight, Gavin Huttley, and Peter Maxwell"
__copyright__ = "Copyright 2007, The Cogent Project"
__credits__ = ["Rob Knight", "Peter Maxwell", "Gavin Huttley",
                    "Matthew Wakefield"]
__license__ = "GPL"
__version__ = "1.0.1"
__maintainer__ = "Rob Knight"
__email__ = "rob@spot.colorado.edu"
__status__ = "Production"

class NumberList(list):
    pass    #much code deleted
class FrequencyDistribution(dict):
    pass    #much code deleted

if __name__ == '__main__':    #code to execute if called from command-line
    pass    #do nothing - code deleted
#use this either for a simple example of how to use the module,
#or when the module can meaningfully be called as a script.
 

SitePackages

Nützliches

   $ sudo pip install requests
   $ sudo pip install beautifulsoup4
   $ sudo pip install MySQL-python
   $ sudo pip install --upgrade setuptools --user python

Falls eine spezielle Verison installiert werden soll:

   $ sudo pip install -I geocoder=1.23.2

PyQt

   $ brew install pyqt
   $ sudo apt-get install python-qt4 pyqt4-dev-tools qt4-designer

Directory

Alle installierten Packages befinden sich bei Mac OS X unter /Library/Python/2.7/site-packages/

Zur weiteren Anzeige des Installationsorts von site packages

import site
site.getsitepackages()
 

Module finden

print(module_name.__file__)
 

Numpy

Soll eine neuere Verison von Numpy installiert werden als aktuell vorhanden, so kann dies durch folgenden Befehl erfolgen:

   $ sudo pip install numpy 

War die Installation erfolgreich, so befindet sich der Ordner des Moduls in Mac OS X unter Library/Pyth/MEINE-VERISON/site-packages
Dies ist jedoch nicht die default directory unter der das System sucht. Diese befindet sich unter System/Library/Frameworks/Python.framework/Versions/MEINE-VERISON/Extras/lib/python
Die dort befindliche -vermutlich veraltete Datei- kann nicht ersetzt werden ohne dass das System einen Fehler ausgibt.
Um das System zu zwingen, die Module, welche durch pip oder mittels python setup.py install installiert wurden zu nutzen, muss dies im .bash_profile angegeben werden.

   export PYTHONPATH="/Library/Python/MEINE-VERISON/site-packages"

Abschließend wird noch der Ordner des veralteten oder nicht mehr benötigten Moduls im Verzeichnis System/Library/Frameworks/Python.framework/Versions/MEINE-VERISON/Extras/lib/python gelöscht oder einfacher der Name geändert, z.B. von numpy auf numpy-old, so kann er wiederhergestellt werden, sollte später etwas schief gegangen sein.
Zum Abschluss kann im Terminal eine Abfrage über die aktuelle Versionsnummer des Moduls durchgeführt werden

   $ python -c 'import mein-modul; print mein-modul.__version__'

Python 3

Um Python 3 als default Python Verison zu nutzen, muss dies im .bash_profile angegeben werden.

   PATH="/Library/Frameworks/Python.framework/Versions/GEWUENSCHT-VERSION/bin:${PATH}"

PYC to PY

Um Files *.pyc zurück auf *.py zu konvertieren kann

   $ uncompyle2 changeLog.pyc

verwendet werden.
Dazu muss Uncompyle2 installiert sein.

Virtual Environments

Virtual Environments Tutorial

Strato

Ab dem Packet "Power Web Basic" (Stand Juni 2016) können Python und Ruby Scripts auf den Strato Servern ausgeführt werden.

Rechte

Diese müssen sich unter '/cgi-bin/' befinden und über die entsprechenden Rechte verfügen. Diese werden folgedermaßen erteilt:

   $ ssh deine-domain.de@ssh.strato.de
   $ cd /cgi-bin/
   $ chmod 755 fileName

Aussehen

Das Beispiel ist hier zu finden.

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# enable debugging
import cgitb
cgitb.enable()
print "Content-Type: text/plain;charset=utf-8"
print
print "Hello World!"
 

Logging

Log Level

Wird der Level auf z.B. "Warning" gesetzt, so wird nur alles davon und darüber ausgegeben, also Warning, Error und Critical

EXEPTION (special, has an Error level of 30)
CRITICAL 50
ERROR 	 40
WARNING  30
INFO 	 20
DEBUG 	 10
NOTSET 	 0
 

Log Format

logFormat = "[%(asctime)s] [%(levelname)-8s] [%(filename)-20s @ %(funcName)-15s:%(lineno)4s] %(message)s"
logging.basicConfig(format=logFormat, level=logging.INFO)
 
[2017-04-21 14:14:23,813] [DEBUG  ] [downloadMissing.py   @ downloadFiles  : 114] downloaded latest.txt
 

Logging deaktivieren

Allgemein

logger = logging.getLogger()
logger.disabled = True
... whatever you want ...
logger.disabled = False
 

Spezielles Level

logging.disable(logging.CRITICAL)
 

Modulweise

logger = logging.getLogger('my-logger')
logger.propagate = False
 

Threading

Um einen Thread von außerhalb stoppen zu können, muss dieser als 'Daemon' gekennzeichnet sein.

# start thread
self.myDownloadThread = DownloadThread.DownloadThread(
	gnum=self.download_number, 
	url=url, 
	fsize=fsize)
time.sleep(10)	# wait a little bit until you kill the thread
for t in threading.enumerate():
	threadName = t.getName()
	isAdaemon = t.isDaemon()
	# print threadName, isAdaemon
	if threadName == 'download-thread':
		# print "at the download-thread"
		try:
			self.myDownloadThread.stopIt()
		except Exception, e:
			# raise e
			pass
 

class DownloadThread(threading.Thread):
	"""Downloading thread""" 
	def __init__(self, gnum, url, fsize):
		"""Constructor"""
		threading.Thread.__init__(self, name='download-thread')
		self.fsize = fsize
		self.gnum = gnum
		self.url = url
		self.setDaemon(True)	# without this you can not stop the thread from outside
		self.start()

	def stopIt(self):
		print "Trying to stop thread..."
		self._stop.set()

	def run(self):
		"""Run the worker thread"""
		local_fname = "download"
		count = 1
		print "Running %d" %count
 

Tricks

for loop

myList = [12, 234, "Hans", [1,2,3], {'a':1, 'b':2}, True]
for idx, val in enumerate(myList):
    print(idx, val)
 

Prozent Zeichen

Soll ein '%' in einem String verwendet werden, so wird dies normalerweise für nachfolgende Variablen verwendet. Daher muss folgendes verwendet werden:

myString = ("%d kB / %s kB (%1.1f%%)" %(downloaded, totalSize, (float(downloaded)/float(totalSize))*100.0))
 

Mehrzeiliger String

print("""bla 
blabla 
lsl""")
 

Import

Umschreibung nötig z.B für Freeze von Programmen

import Crypto.Cipher.AES as AES
from Crypto.Cipher import AES
 

Falls von einem Parent Directory etwas importiert werden soll Python Docs PEP328Stackoverflow Parent Directory Import

application
    lib
        __init__.py
        mySpecialLib.py
        SubLib
            __init__.py
            mySubLib.py
    __init__.py
    layout
        __init__.py
        myLayout.py
    main.py
    someFile.py
 

Im File "mySpecialLib.py" soll "someFile.py" importiert werden

import sys
sys.path.append("..")             # from parent directory
# sys.path.append("/path/to/dir") # from some other directory
from layout import myLayout
 

Im File "main.py" soll "mySpecialLib.py" importiert werden

from lib import mySpecialLib 
 

Im File "main.py" soll "mySubLib.py" importiert werden

from lib.SubLib import mySpecialLib 
 

Variable von außen

class Example(object):
    def __init__(self):
        self.itsProblem = "problem"

theExample = Example()
print(theExample.itsProblem)
 

Bool List to 01 List

mylist  = [True , True, False]
myNewList = [int(i) for i in mylist]
 

Liste generieren

Generiert Liste mit allen Zahlen von 1 bis 100 falls diese durch 2 dividierbar sind und fügt das multiplierte Ergebnis in die Liste

myList = [2*a for a in range(100) if a % 2 == 1]
print myList
 
[2, 6, 10, 14, 18, 22, 26, 30, 34, 38, 42, 46, 50, 54, 58, 62, 66, 70, 74, 78, 82, 86, 90, 94, 98, 102, 106, 110, 114, 118, 122, 126, 130, 134, 138, 142, 146, 150, 154, 158, 162, 166, 170, 174, 178, 182, 186, 190, 194, 198]
 

Random True False

bool(random.getrandbits(1))
 

Dict to file

myDict = eval(open('deed.txt', 'r').read())
 

String from Time

String from Time Help Page

Neueste Directory/File anzeigen

Neueste Directory

import os
newest = max(os.listdir('.'), key = os.path.getctime)
print newest
 

Neuestes (MP3) File

import glob
newest = max(glob.iglob('*.[Mm][Pp]3'), key=os.path.getctime)
print newest
 

Terminal Commands

Aufführen von Terminal Komandos via Python

import commands
resultString = commands.getoutput('ls ~/Downloads')
print resultString
 

WLAN Informationen

iwlist Parser, funktioniert nur auf Linux ;) gefunden auf Raspberry Forum

Progress Bar

Nilton Volpato Python Progressbar Rick van Hattem Python Progressbar <- vielleicht besser ;)

Beispiel für Nilton Volpato Progressbar

#!/usr/bin/python
# -*- coding: utf-8 -*-

from progressbar import AnimatedMarker, Bar, BouncingBar, Counter, ETA, \
    AdaptiveETA, FileTransferSpeed, FormatLabel, Percentage, \
    ProgressBar, ReverseBar, RotatingMarker, SimpleProgress, Timer
import time

my_list = [2*a for a in range(1000) if a % 2 == 1]

#widgets = ['Processed: (', Percentage(), ')',  Counter(), ' value number (', Timer(), ')', Bar()]
widgets = [Percentage(), ' ', Bar(), ' ', ETA(),]
pbar = ProgressBar(widgets=widgets)

for x in pbar(my_list):
        time.sleep(0.1)
 
 42% |#################################                                               | ETA:  0:00:29
 

Installations Fehler

Clang

Falls bei der Installation eines Python Packets nachfolgender Fehler auftritt:

error: Setup script exited with error: command 'clang' failed with exit status 1
 

sollte dieser wie folgt behoben werden können:

   $ sudo bash
   $ export CFLAGS=-Qunused-arguments
   $ export CPPFLAGS=-Qunused-arguments
   $ python setup.py install OR pip install -U packageName

Clang Error Stackoverflow

Credits

Accessing a Class Variable