Pi Python3 tanulas ...

 ( Ice | 2018. december 26., szerda - 20:43 )

#! /usr/bin/env python3
#
# rathunter4.py by Ice
#

import io
from gpiozero import MotionSensor, LED
import picamera
import time
import datetime
import subprocess
import atexit
import logging

ir = False
logfile = "/var/log/rathunter/rathunter.log"
moviesdir = "/media/hdd/"
host = subprocess.getoutput(["hostname", "-s"])

@atexit.register
def goodbye():
    print("You are now leaving the rathunter4.py program.")

#Function to get get date and time
def dt():
    return datetime.datetime.now().strftime("%Y-%m-%d_%H.%M.%S")

# Function to create new Filename from date and time
def getFileName(o):
    return moviesdir+host+"-"+o+".h264"

def motion():
    d = dt()
    print(d, "Motion is detected detected by the HC-SR501 motion sensor!")
    logging.info("Motion is detected detected by the HC-SR501 motion sensor!")

def nomotion():
    d = dt()
    print(d, "There is no motion deteted by the HC-SR501 motion sensor!")
    logging.info("There is no motion deteted by the HC-SR501 motion sensor!")

def security():
    global ir
    logging.basicConfig(filename=logfile, level=logging.INFO, format="%(asctime)s %(message)s", datefmt="%Y-%m-%d_%H.%M.%S")
    logging.info("The rathunter4.py was started.")
    with MotionSensor(7) as pir: #Create Object for HC-SR501 and assign pin 26(GPIO 7) to PIR
        print("Press Ctrl+c to exit!")
        d = dt()
        print(d, "The HC-SR501 motion sensor is being initialized ...")
        logging.info("The HC-SR501 motion sensor is being initialized ...")
        pir.when_motion = motion
        pir.when_no_motion = nomotion
        with picamera.PiCamera() as camera:
            camera.resolution = (1280, 720)
            camera.framerate = 25
            camera.rotation = 0
            stream = picamera.PiCameraCircularIO(camera, seconds=6)
            # Camera warm-up
            d = dt()
            print(d, "The camera is warming up, waiting for 2s ...")
            logging.info("The camera is warming up, waiting for 2s ...")
            time.sleep(2) # Camera warm-up time
            camera.start_recording(stream, format='h264', quality=20)
            try:
                while True:
                    camera.wait_recording(1)
                    if pir.motion_detected == True:
                        if ir == True: #Turn on LED(IR reflector) if needed
                            #Assign pin 16(GPIO 23) to LED(IR Reflector)
                            with LED(23) as led:
                                led.on() #Turn on LED(IR reflector)
                        # Keep recording for 6 seconds and only then write the
                        # stream to disk
                        # Get a Filename
                        d = dt()
                        filename = getFileName(d)
                        #camera.annotate_background = picamera.Color("black")
                        camera.annotate_text = host+" Cam "+d
                        # Keep recording for 3 seconds and only then write the
                        # stream to disk
                        camera.wait_recording(3)
                        if ir == True: #Turn off LED(IR reflector) if needed
                            with LED(23) as led:
                                led.off() #Turn off LED(IR reflector)
                        t1 = time.time()
                        stream.copy_to(filename)
                        t2 = time.time()
                        sdiff = str("{0:0.2f}".format(t2 - t1))
                        print(d, filename+" was created. The stream copying time was", sdiff, "seconds.")
                        logging.info(filename+" was created. The stream copying time was "+sdiff+" seconds.")
            except KeyboardInterrupt:  #Ctrl+c
                pass #Do nothing, continue to finally
            finally:
                camera.stop_recording()
                logging.info("The rathunter4.py was ended.")

def main():
    security()

main()

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

A forráskódot rakd be így code környezetben, olvashatóbb lesz:

[code]
...
def getFileName():
   return datetime.datetime.now().strftime("%Y-%m-%d_%H.%M.%S.jpg")
...

[/code]

Milyen faja is az, amikor a tördelés a kód része... :-D

Milyen fain is az, amikor nem csak a tervezési hibákat, de még a sorokat is egyesével kell kiganézni egy legacy kódban, mert a nyelv túl megengedő volt, az előző fejlesztő meg úgy gondolta, hogy milyen cool az obfuscated Perl vagy C.

man cb
(C beautifier. Gyengébbek kedvéért az indent parancs elődje már 30 - 35 évvel ezelőttről. Azaz már akkor sem kellett neked kiganézni, ha nem tetszett az előző fejlesztő konvenciója.)

=====
tl;dr
Egy-két mondatban leírnátok, hogy lehet ellopni egy bitcoin-t?

+1, Perl esetén ott a perltydy (perldoc perltidy), de más nyelvekre is van kódformázó tool, ami a péklapáttal kezelendő kódgányolók szemetét emészthető (csapatmunka esetében közös kódbázisba berakható) formára hozza.

Mindez nem változtat azon, hogy ha például egy C kódot szúrt volna be így (= indent nélkül), az szintén nehezen olvasható volna.

+1
--
eutlantis

Az legfeljebb nehezen olvasható, a python viszont használhatatlan. Remélem, érzed a különbséget...

+2

Viszont cserebe mukodik. Az is egy nagy szo. Bemasolsz egy kodreszltetet valami egyedi(bb) stylesheet-tel rendelkezo forumra - es ugyan nem biztos hogy a legszebben fog kinezni, de ha egy masik Pistike kimasolja a kis editoraba, leforditja, stb, akkor mukodni fog es azt csinalja amire a kolto gondolt. Az ultimate enterprise agyonhajpolt csodapalytonnal ezt nagyjabol cseszheted. Es akkor az "emailen atkuldjuk" meg haosonlo josagokrol ne is beszeljunk.

Egy pythonos kód "ömlesztett" közzététele nem a nyelvet minősíti, hanem a mindenkori publikálót.
Ez csak megjelenítési probléma olyan médiumokon, mint a HTML és a PDF, ahol alapértelmezetten a 0x20 értéktelen, információt nem hordozó, és így kidobandó kód. A szöveg- és kódszerkesztők persze kezelik. És ugye speciális tagokkal a HTML és PDF is. De lehetett volna fordítva is, azaz, hogy a 'space' alapértelmezetten feldolgozásra kerül és a lenyeletéséhez lenne szükség speciális tag használatára.
Véleményem szerint ez az egész csak megszokás kérdése, azaz világnézeti probléma:-)
(Hagyjuk el az Univerzumból is, amit nem látunk, a neutrinót, a sötét anyagot. Ugyanolyan rosszul fog működni, ahogy egy Python-kód:-)

--
eutlantis

Hat, nem tudom. Ha egy program mukodese attol fugg hogy hogy is vannak azok a dolgok amiket nem lathatunk by def, akkor az azert erosen szuboptimalis. Most nem csak az indentalasra (ugy altalaban) gondolok, hanem a tab vs. 8 space vs. 4 space vs. "annyi space amennyit a kedvenc editorom epp odagondol mikor mas kodjat basztatom es/vagy osszemixelem a sajatommal" temakorben.

A sor eleji whitespace kettő (plusz egy) nyelvben releváns infó: Whitespace és Python - aplusz egy az a Fortran.

"ez az egész csak megszokás kérdése" - igen, a szépen formázott kód is csak megszokás kérdése - lenne, de a pájton nem megszokás, hanem megsz0pás alapon kényszeríti ki a "szépre" formázott kódot. Miért? Mert önmaguktól szépen dolgozni képtelen/nem akaró (lusta, trehány) kódfaragóknak is sikerélményt akar nyújtani. Gondolom, a nyelv és a szintaxis megalkotója önmagából kiindulva csinálta ilyenre, amilyen...

Mert önmaguktól szépen dolgozni képtelen/nem akaró (lusta, trehány)...
Hát bizony ezek a lusták, trehányak szívnak, ha elfelejtenek indentálni.
Meg a nem lusták, nem trehányak is, ha figyelmetlenek.

Miért foglalkozol ennyit a Pythonnal, ha utálod? Ez érthetetlen számomra.
Egyébként a Google, és ha jól tudom a Facebook rendszereiben is millió sornyi Python-kód van.
A Python "teljes használhatatlansága" ellenére.

--
eutlantis

Nem írtam sehol, hogy teljesen használhatatlan, csak azt, hogy a whitespace, mint a programkód vitális komponense az szerintem ordenáré nagy baromság, és vegyes környezetben, kódrészletek megosztásánál irgalmatlan nagy katyvaszt tud csinálni.
Láttam Perl könyvet, ahol a forráskódok egy részét proporcionális betűtipussal szedték valamilyen általam ismeretlen okból. Nem okozott gondot. Ugyanez pájton könyvnek egyenes út a zúzdába, mert használhatatlanná válik a forrás csak attól, hogy nem látszik, hova hány és milyen whitespace karakter kerülne.

Erről csak annyit, hogy kezdő bitfarigcsálóként sokáig tartott megszoknom, hogy milyen is a _nekem_ optimális indentálás. Volt tab, majd 1 < x < 8 space, aztán ez csökkent 4-re, aztán végül 2-re - a vi azon jó tulajdonságát kihasználva, hogy meg lehetett neki mondani, hogy én márpedig tabulátorkodni szeretnék, de vizuálisan nem szeretem a hosszú sorokat. Nekem jó volt, más meg azt csinált a tabjaimmal, amit akart - a fent emlegetett cb-vel. De mondjuk Pythonban valszeg nagyon gáz lenne a 2 szóköz(nek látszó tab). Nekem mindig vizuális segítséget (is) jelentett a kapcsos zárójel.

(Fájl elején:
/*
ex: ts=2 sw=2
*/
vagy hogy is kellett ezeket a formázó vackokat beleírni.)

=====
tl;dr
Egy-két mondatban leírnátok, hogy lehet ellopni egy bitcoin-t?

Nem valótlan amit írsz, de nem hiszem, hogy ettől a python rossz lenne.

Valóban, ha a könyv nyomtatását elcseszik (bár pont a proporcionális karakteres indentálásnál még látszik az, hogy melyik van kijjebb, melyik meg beljebb), akkor a könyv kuka.

Jobban oda kell figyelni.

Nehezebb megosztani forrást? Igen, jobban oda kell figyelni. Ettől a nyelv nem rossz.

Ha C-ben programozunk, akkor is oda kell figyelni dolgokra. Csak más dolgokra figyelünk. Nem ettől lesz jó vagy rossz egy nyelv.

Persze én, te, bárki más dönthet úgy, hogy valamelyik nyelvet valamelyik tulajdonsága miatt nem kedveli, ez mindenki szíve joga. De ettől nem lesz az a nyelv rossz.

Vannak olyan példák is, amikor valóban a python a hülye, nem az, aki rosszul használja? Komolyan a python baja, hogy ha valaki egyszer programkód létére proporcionális betűtípussal nyomtatná könyvbe, akkor szar lenne a könyv? Véletlen se az a fasz, aki kódot nem fix széles betűvel szed, pláne, ha python könyv írására adja a fejét? Esetleg az, aki nem találja meg a code tagnak megfelelő cuccot az egzotikus weboldalában, vagy képtelen megtalálni az attach gombot a levelezőjében?

Tőlem éppen kint lehetne egyébként a balcici-jobbcici, engem nem zavarna, biztos szívatott is meg már életemben legalább annyiszor az indentálás, mint máshol egy fölös vagy egy hiányzó pontosvessző, de igazából ritka, mint a fehér holló (kivéve, ha undormány, gépelés közben gondolkozós spagetti esett ki a kezedből, de annak meg úgyis mindegy). Azt is tudom, hogy neked minden ilyen fáj, de azért megmosolyogtató látni, hogy bár abban mind egyetértünk, hogy kódot normálisan formázni alapvető elvárás (ami egyébként kb mindenhol úgy kezdődik, hogy meg ne lássunk \t-ket, mert ütünk), de ha a python ezt használja, akkor az pfujj gonosz rettenet az egész.

Azon meg szintén érdemes lenne elgondolkodnod / magadba nézned, hogy kiről mond mit az, hogy te úgy gondolod, hogy, "Miért? Mert önmaguktól szépen dolgozni képtelen/nem akaró (lusta, trehány) kódfaragóknak is sikerélményt akar nyújtani. Gondolom, a nyelv és a szintaxis megalkotója önmagából kiindulva csinálta ilyenre, amilyen..." nem úgy, hogy pl azért ilyen, mert úgyis mindenki így kódol in practice.

Van egy rossz hírem: fel kell venned a listába a nim programozási nyelvet is. :-)

Most kezdtem el tanulni a python3-at.
Ennyi.
Megformaztam.

A Pythonnal újonnan ismerkedőknek mindent megbocsátunk:-) Meg egyébként is, gyakorlatilag még karácsony van...
--
eutlantis

Nyitnék egy másik ágat: általában ezt tekintjük jó she-bang-nek? Kezdve ott, hogy pl. FreeBSD-n /usr/local/bin/python az elérési útvonala. Ráadásul itt (és tudtommal nagyon sok Linux terjesztéseben is) az alapértelmezett Python még mindig a 2-es. Azaz a napokban valakinek én pont azt magyaráztam, hogy ha neki explicit Python3 kell, akkor melegen javasolt ezt írni.

#! /usr/bin/env python3

*Szigorúan* szerintem ez lenne a helyes.

=====
tl;dr
Egy-két mondatban leírnátok, hogy lehet ellopni egy bitcoin-t?

Igen. A shebang-ben meg kell adni az elérési utat, viszont nem tudhatjuk biztosan hogy a python hol van. Az env mindig ugyanott van, és a PATH segítségével elindítja a pythont.

Szerk.:
Rosszul fogalmaztam; természetesen tudhatjuk, hogy hol van a python vagy a python3, csak ha nem kell törődnünk az elhelyezkedésével, akkor jól jön az 'env'.
--
eutlantis

Válasz a Szerk-re: te tényleg biztos vagy benne látatlanban, hogy mondjuk az AIX-es / HP-UX-es / Kiskutyafüle Linux disztrós / Anyámkínja BSD-s környezetről tudod, hogy hol a Python3?
Mert amíg csak én futtatom ezt a kódot a saját, jól ismert környezetemben, addig OK, nade abban a pillanatban, ha más is a sajátjában ...

Szóval *szerintem* nem kell a Szerk.

=====
tl;dr
Egy-két mondatban leírnátok, hogy lehet ellopni egy bitcoin-t?

Persze, igazad van.
Egyébként Androidon a Termux-ban még az 'env' is máshol van, ezért van egy termux-fix-shebang parancs, ami a desktopról átmásolt scriptben módosítja a shebang-ot.
--
eutlantis

*Szigorúan* szerintem ez lenne a helyes.
Vagy barmi a temaba vago sztenderd referencia abrarol :) Plusz tetszoleges mennyisegu virtualenv... atlagosan 2-3 per Python Pistike.

mukodik ez egyatalan es python3 ez egyatalan? az a print kicsit mast mutat. bar hol igy, hol ugy hasznalod..

Szerintem python2. Az újabbak elfogadják a zárójeles print-et is.
--
eutlantis

Szerintem sem mukodik igy python3 alol. Szerencsere 2-est hasznal, csak o hiszi 3-nak.

--
When you tear out a man's tongue, you are not proving him a liar, you're only telling the world that you fear what he might say. -George R.R. Martin

erre sem vennek merget, van ott print() is, de future print_function import nincs
es semmikepp nem neveznem a kettes hasznalatat 'szerencse'-nek :)

Ez nem szükséges egy ideje: "import future print_function"
--
eutlantis

akkor ma is tanultam valami, de szerencsemre nincs hol kiprobalnom :)

ps.: par honapja meg volt egy wheezy virtualom pysparkhoz, ott gyakran belefugottam abba, hogy print()-et hasznaltam future import nelkul, szova is tette.. virtualt mar lecsereltek, ott meg talaltam python2-t es tenyleg nem kell mar a future import, kosz az infot

A „from __future__ import print_function” arra kell, hogy pont ugyanúgy működjön, mint a python 3.x alatt. Tehát enélkül, egyes esetekben nem ugyanazt az eredményt kapod 2.7 és 3.x alatt.

Ezt én sem tudtam (de valójában csak 3-ast használok).
--
eutlantis

Amikor elkezdtem az ismerkedést a Pythonnal, akkor olvastam a különbségekről a 2-es és a 3-as között, és akkor találkoztam vele. Aztán valamiért nem felejtettem el. :-)

nem, hogy nem ugyanazt kapod de nem is mukodik, azaz mukodott, ahogy kantal kijavitott ;)

Én a Python 2.7-ről olvastam, hogy ott működött/működik. Igaz, én is a 3-ast használtam, így viszont nincs gyakorlati tapasztalatom. A 2.7-tel úgy találkoztam csak, hogy egy kicsit patch-eltem az mpdlcd kódját.

A könyvjelzőim között ezt találtam: https://www.python-course.eu/print.php

python2:
print "valami" # mukodik, python3 megjelenese elott ez volt syntax
python3:
print("valami") # mukodik, uj syntax(nem csak syntax de az a lathatobb)

python2 a harmas megjelenese utan (python3 syntax):
from __future__ import print_function
print("valami") # mukodik

python2(fogalmam sincs miota, de nem mukodott azonnal a harmas megjelenese utan):
print("valami") # mukodik

viszont python3:
print "valami" #nem mukodik
igy a topicnyito scriptje is gyanus hogy python3 alatt futna

tehat python3 visszafele nem kompatibilis
regebbi python2 verziok az import print_function nelkul nem tudtak a print()-et

Én konkrétan a 2.7-esről írtam. Te konkrétan melyik verzióról írsz? Mert általánosságban is vitatkozhatunk, csak úgy semmi értelme a dolognak.

„python2(fogalmam sincs miota, de nem mukodott azonnal a harmas megjelenese utan):”

Sehol sem írtam, hogy azonnal. Sőt az időtényezőről egyáltalán nem nyilatkoztam. De ez késés nem meglepő, mert a python 3-as megjelenése után nyilván kellett egy kis idő, amíg a 2-es ágba is bekerült. Viszont a fentebb linkelt oldal sem ma született.

Egy kis google után: A Python 3.0 2008 decemberében jött ki, a Python 2.7 pedig 2010 júliusában. Tehát kb. másfél év után jelent meg a print függvény a 2-es ágban. Ez tényleg nem azonnal volt, de már nyolc éve, amire már mondhatjuk, hogy a 2.7-ben már régóta működik.

Működik, de mást fog kiírni néhány esetben, ezért kell a from __future__ import print_function.

$ python3
Python 3.7.2rc1 (default, Dec 12 2018, 06:25:49) 
[GCC 8.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> print ("alma", 3)
alma 3

És python2-vel:

$ python2
Python 2.7.15+ (default, Nov 28 2018, 16:27:22) 
[GCC 8.2.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> print ("alma", 3)
('alma', 3)

>>> from __future__ import print_function
>>> print ("alma", 3)
alma 3

Egyébként a Python2 szintaktika nálam főleg a pypy miatt játszik, mert a legtöbb disztribúcióban kizárólag pypy2 érhető el alapból. A fenti pypy2 esetén is ugyanígy.

További jelentős szivatás egyébkén az integeres osztás.

$ pypy   # vagy python2
Python 2.7.13 (6.0.0+dfsg-3, Nov 03 2018, 15:04:50)
[PyPy 6.0.0 with GCC 8.2.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>> 5/2
2
>>>> from __future__ import division
>>>> 5/2
2.5