Benutzer-Werkzeuge

Webseiten-Werkzeuge


python

Dies ist eine alte Version des Dokuments!


Python

1990: Python (1): 1990
2000: Python 2.0: 2000
2008: Python 3.0: 2008
2010: Python 2.7: 2010
2017: Instagram wechselte zu 100% auf Python 3.5
2020: seit 01. Jan. 2020 gibt es keinen Support für Python-2 mehr

allgemeines

# lsb_release -d
Description:    Ubuntu 18.04.4 LTS

# apt search python | egrep ^python[0-9][.][0-9][/]
python2.7/bionic-updates,now 2.7.17-1~18.04 amd64
python3.6/bionic-updates,now 3.6.9-1~18.04 amd64
python3.7/bionic-updates 3.7.5-2~18.04 amd64
python3.8/bionic-updates,now 3.8.0-3~18.04 amd64

# apt install python3.8/bionic-updates

# ls -lha /usr/bin/python /etc/alternatives/python
lrwxrwxrwx 1 root root    9 Apr 16  2018 /usr/bin/python -> python2.7

# update-alternatives --install /usr/bin/python python /usr/bin/python3.8 10

# ls -lha /usr/bin/python /etc/alternatives/python
lrwxrwxrwx 1 root root 18 Mär 12 18:19 /etc/alternatives/python -> /usr/bin/python3.8
lrwxrwxrwx 1 root root 24 Mär 12 18:19 /usr/bin/python -> /etc/alternatives/python

Die bekanntesten Unterschiede zwischen Python-2 und Python-3

  • Python 2
    • "print" war noch ein Schlüsselwort
      • print "Hallo Welt!"
  • Python 3
    • "print" ist jetzt eine Funktion
      • print("Hallo Welt!")
    • "range" verhält sich jetzt wie das "xrange" aus Python2
      • "xrange" gibt es nicht mehr
    • Exception wird jetzt ohne Komma geschrieben, statt dessen jetzt mit "as"
    • Divisionen sind jetzt immer vom Type "float"
    • Bibliotheken haben keine Großbuchstaben mehr

Beispiele

Equivalent zu "set -x"

als erstes

==   Vergleich
=    Zuweisung
>    größer als
<    kleiner als
//   Division mit Rest - nur die ganze Zahl wird ausgegeben
%    Division mit Rest - nur der "Rest" wird ausgegeben
**   Potenz - "2**10" (1024) entspricht 2^10
[]   Liste (ähnlich einem Array)

siehe https://www.tutorialspoint.com/python/python_variable_types.htm ganz unten

s = str(sys.argv[1])
print("String: %s" % s)

i = int(sys.argv[1])
print("Integer: %d" % s)

f = float(sys.argv[1])
print("Float: %f" % s)

r = repr(sys.argv[1])
print("String: %r" % r)

Beispiel zu Liste (Listen kann man auch in Listen haben):

liste.py
#!/usr/bin/python
 
#
# Beispiel zu Liste
#
 
v = [1,2,3,4]
print v
print v[2]
v = v + [5]
print v
v = v + [8,13]
print v
v.append(42)
print v
> ./liste.py
[1, 2, 3, 4]
3
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5, 8, 13]
[1, 2, 3, 4, 5, 8, 13, 42]
test.py
#!/usr/bin/python
 
print 'hi'
print 'hi' * 3
print 'hi' * 3 + 'ho'
print 'hi' + 'ho'
> ./test.py
hi
hihihi
hihihiho
hiho

Print

Argumente

arguments.py
#!/usr/bin/python
 
import sys
 
print sys.argv
 
print "oder mit for-Schleife:"
 
for i in range(len(sys.argv)):
    if i == 0:
        print "Skriptname: %s" % sys.argv[0]
    else:
        print "%d. Argument: %s" % (i,sys.argv[i])
> python arguments.py ARG1 ARG2 ARG3
/usr/local/bin/arguments.py
#!/usr/local/bin/python3.7
 
import sys
 
print(sys.argv)
 
print("oder mit for-Schleife:")
 
for i in range(len(sys.argv)):
    if i == 0:
        print("Skriptname: %s" % sys.argv[0])
    else:
        print("%d. Argument: %s" % (i,sys.argv[i]))
> /usr/local/bin/arguments.py ARG1 ARG2 ARG3
['/usr/local/bin/arguments.py', 'ARG1', 'ARG2', 'ARG3']
oder mit for-Schleife:
Skriptname: /usr/local/bin/arguments.py
1. Argument: ARG1
2. Argument: ARG2
3. Argument: ARG3

Rechnen

> vi rechnen.py
rechnen.py
#!/usr/bin/python
 
for x in range(1,11):
        print '{0:2d} {1:3d} {2:4d}'.format(x, x*x, x*x*x)
> python rechnen.py
 1   1    1
 2   4    8
 3   9   27
 4  16   64
 5  25  125
 6  36  216
 7  49  343
 8  64  512
 9  81  729
10 100 1000
fibonacci.py
#!/usr/bin/python
 
#
# Fibonacci - Reihe
#
 
y=0
z=1
for i in range(1,11):
        x=y
        y=z
        z=x+y
        print '{0:4d}'.format(z)
> ./fibonacci.py
 1
 2
 3
 5
 8
13
21
34
55
89

suchen und ersetzen (SED)

/home/bin/ersetzen_zeichen.py
#!/usr/bin/env python
 
#------------------------------------------------------------------------------#
#
# Dieses Skript ersetzt Zeichen in einer Zeichenkette
#
#------------------------------------------------------------------------------#
#
# https://lzone.de/examples/Python%20re.sub
#
# ersetzen
#
# ${0} [Zeichenkette] [suchen] [Ersatz]
#
# /home/bin/ersetzen_dateiinhalt.py Film.mpg .mpg e
#
#------------------------------------------------------------------------------#
 
import sys
import re
 
zeichenkette = sys.argv[1]
suchen = sys.argv[2]
ersatz = sys.argv[3]
 
ret = re.sub(suchen,ersatz, zeichenkette)       # hier wird ersetzt
print ret
/home/bin/ersetzen_dateiinhalt.py
#!/usr/bin/env python
 
#------------------------------------------------------------------------------#
#
# Dieses Skript ersetzt Zeichen in einer Datei
#
#------------------------------------------------------------------------------#
#
# https://lzone.de/examples/Python%20re.sub
#
# ersetzen
#
# ${0} [Datei] [suchen] [Ersatz]
#
# echo "Film.mpg" > /tmp/test
# /home/bin/ersetzen_dateiinhalt.py /tmp/test .mpg e
#
#------------------------------------------------------------------------------#
 
import sys
import re
 
datei = sys.argv[1]
suchen = sys.argv[2]
ersatz = sys.argv[3]
 
with open (datei, "r") as myfile:
        s=myfile.read()
 
ret = re.sub(suchen,ersatz, s)  # hier wird ersetzt
print ret

GREP

/home/bin/greptest.py
#!/usr/bin/env python
 
import re
 
eingabe = "Apfel Birne Banane Kirsche Pflaume"
 
treffer = re.findall(r'.* Banane', eingabe)[0]
print treffer;
 
print "--------------------------------------"
 
treffer = re.search(r'Banane .*', eingabe)
print treffer.group();
> /home/bin/greptest.py
Apfel Birne Banane
--------------------------------------
Banane Kirsche Pflaume

CAT

/home/bin/cattest.py
#!/usr/bin/env python
 
# https://www.hdm-stuttgart.de/~maucher/Python/html/EingabeAusgabe.html
 
import sys
 
datei = sys.argv[1]
fin = open(datei, mode='r')
for line in fin:
        #print line
        sys.stdout.write(line)
fin.close()

SPLIT

https://www.mkyong.com/python/python-how-to-split-a-string/

/home/bin/splittest.py
#!/usr/bin/python
 
alphabet = "a b c d e f g"
 
data = alphabet.split() #split string into a list
for temp in data:
    print temp
 
print "--------------------------------------"
 
data = alphabet.split(" ",0)
for temp in data:
    print temp
 
print "--------------------------------------"
 
data = alphabet.split(" ",2)
for temp in data:
    print temp
 
print "--------------------------------------"
 
data = alphabet.split(" ",-1)
for temp in data:
    print temp
> /home/bin/splittest.py
a
b
c
d
e
f
g
--------------------------------------
a b c d e f g
--------------------------------------
a
b
c d e f g
--------------------------------------
a
b
c
d
e
f
g

UDP Socket communication (bind/connect)

server.py
#!/usr/bin/env python
 
from socket import socket, AF_INET, SOCK_DGRAM
 
# socket.AF_INET: IPv4
# socket.AF_INET6: IPv6
# socket.AF_UNIX: unix sockets
# socket.SOCK_DGRAM: datagram (UDP)
udp_socket = socket(AF_INET, SOCK_DGRAM)
 
# bind creates a server (listener)
# connect creates a client
udp_socket.bind(("127.0.0.1", 64512))
 
while True:
    # reads up to 1024 Bytes
    message, address = udp_socket.recvfrom(1024)
 
    # decode() converts bytes[] to a String
    print("Message from " + str(address) + " with text: " + message.decode())
client.py
#!/usr/bin/env python
 
from socket import socket, AF_INET, SOCK_DGRAM
 
# socket.AF_INET: IPv4
# socket.AF_INET6: IPv6
# socket.AF_UNIX: unix sockets
# socket.SOCK_DGRAM: datagram (UDP)
udp_socket = socket(AF_INET, SOCK_DGRAM)
 
# bind creates a server (listener)
# connect creates a client
udp_socket.connect(("127.0.0.1", 64512))
 
while True:
    message = input("Enter message: ")
 
    # encode() converts a String to bytes[]
    udp_socket.send(message.encode())

MySQL

# apt show python3-pymysql
 
Package: python3-pymysql
Version: 1.0.2-1ubuntu1.22.04.1
Priority: optional
Section: python
Source: python-pymysql
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Debian OpenStack <team+openstack@tracker.debian.org>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 170 kB
Depends: python3:any
Recommends: python3-cryptography
Suggests: python-pymysql-doc
Homepage: https://github.com/PyMySQL/PyMySQL/
Download-Size: 38.4 kB
APT-Sources: http://de.archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages
Description: Pure-Python MySQL Driver - Python 3.x
 This package contains a pure-Python MySQL client library. The goal of PyMySQL
 is to be a drop-in replacement for MySQLdb and work on CPython, PyPy,
 IronPython and Jython.
 .
 This package contains the Python 3.x module.
> apt install python3-pymysql
mysql-test_no_tls.py
#!/usr/bin/python3
 
import pymysql.cursors
 
# Connect to the database
connection = pymysql.connect(
                             user='benutzer',
                             password='geheimes_PassWort',
                             host='192.168.3.146',
                             port=3306,
                             database='mysql',
                             connect_timeout=10,
                             autocommit='True',
                             cursorclass=pymysql.cursors.DictCursor
                             )
print ("connect successful!!")
try:
    print ("================================================================================")
    with connection.cursor() as cursor:
        # SQL
        sql = "SELECT Host,User,ssl_type,ssl_cipher,max_connections,max_user_connections,plugin,max_statement_time FROM user;"
        # Den AbfragenBefehl implementieren (Execute Query).
        cursor.execute(sql)
        print ("cursor.description: ", cursor.description)
        print()
        for row in cursor:
            print(row)
    print ("================================================================================")
finally:
    # Die Verbindung schließen (Close connection).
    connection.close()
mysql-test_+_tls.py
#!/usr/bin/python3
 
import pymysql.cursors
 
# Connect to the database
connection = pymysql.connect(
                             user='benutzer',
                             password='geheimes_PassWort',
                             host='192.168.3.146',
                             port=3306,
                             database='mysql',
                             ssl={"fake_flag_to_enable_tls":True},
                             ssl_ca='/var/lib/mysql/ca.pem',
                             connect_timeout=10,
                             autocommit='True',
                             cursorclass=pymysql.cursors.DictCursor
                            )   
print ("connect successful!!")
try:
    print ("================================================================================")
    with connection.cursor() as cursor:
        # SQL-Variablen
        sql = "SHOW VARIABLES LIKE '%ssl%';"
        # Den AbfragenBefehl implementieren (Execute Query).
        cursor.execute(sql)
        print ("cursor.description: ", cursor.description)
        print()
        for row in cursor:
            print(row)
    print ("================================================================================")
    with connection.cursor() as cursor:
        # SQL-Status
        sql = "SHOW STATUS LIKE '%ssl%';"
        # Den AbfragenBefehl implementieren (Execute Query).
        cursor.execute(sql)
        print ("cursor.description: ", cursor.description)
        print()
        for row in cursor:
            print(row)
    print ("================================================================================")
finally:
    # Die Verbindung schließen (Close connection).
    connection.close()

Bücher

Videos

Raspberry Pi 5

Pins schalten

Das ist nur ein Code-Schnipsel, an dem zu erkennen ist, dass die Pin-Steuerung beim Pi 5 jetzt anders erfolgt als es beim Pi4 war.

import os
from gpiozero import OutputDevice, PWMOutputDevice
 
class MotorController:
    def __init__(self, ena_pin, in1_pin, in2_pin, enb_pin, in3_pin, in4_pin):
        self.ENA = PWMOutputDevice(ena_pin)
        self.IN1 = OutputDevice(in1_pin)
        self.IN2 = OutputDevice(in2_pin)
        self.ENB = PWMOutputDevice(enb_pin)
        self.IN3 = OutputDevice(in3_pin)
        self.IN4 = OutputDevice(in4_pin)
        print("INIT OK")
 
    def set_motor(self, motor, direction, speed):
        """
        Motor steuern.
        motor: 'A1', 'A2', 'B1' oder 'B2'
        direction: 'forward' oder 'backward'
        speed: Geschwindigkeit (0-1)
        """
        if motor == 'A1':
            self.ENA.value = speed
            if direction == 'forward':
                self.IN1.on()
                self.IN2.off()
            elif direction == 'backward':
                self.IN1.off()
                self.IN2.on()
        elif motor == 'B1':
            self.ENB.value = speed
            if direction == 'forward':
                self.IN3.on()
                self.IN4.off()
            elif direction == 'backward':
                self.IN3.off()
                self.IN4.on()
        elif motor == 'A2':
            self.ENA.value = speed
            if direction == 'forward':
                self.IN1.on()
                self.IN2.off()
            elif direction == 'backward':
                self.IN1.off()
                self.IN2.on()
        elif motor == 'B2':
            self.ENB.value = speed
            if direction == 'forward':
                self.IN3.on()
                self.IN4.off()
            elif direction == 'backward':
                self.IN3.off()
                self.IN4.on()
 
    def stop_motor(self, motor):
        """
        Motor stoppen.
        motor: 'A1', 'A2', 'B1' oder 'B2'
        """
        if motor == 'A1' or motor == 'A2':
            self.ENA.value = 0
            self.IN1.off()
            self.IN2.off()
        elif motor == 'B1' or motor == 'B2':
            self.ENB.value = 0
            self.IN3.off()
            self.IN4.off()
/home/http/wiki/data/attic/python.1722005256.txt · Zuletzt geändert: von manfred