Új hozzászólás Aktív témák

  • cousin333
    addikt

    %matplotlib inline
    import matplotlib.pyplot as plt

    Még ennyi tartozik hozzá.

    MOD
    Én nem jöttem rá, asszem el is fogom engedni.

    A matplotlib (amit alapból a pandas is használ) megpróbálja automatikusan generálni az osztásokat és címkéket. Ez általában esztétikusan néz ki, de nem minden esetben éri el a kívánt hatást. Szerencsére szinte minden konfigurálható benne.

    Próbáld meg ezt - az utolsó előtti sorban - hozzáadni:

    plt.xticks(range(1900, 2000, 1))

  • kutga
    félisten

    biztos ez a teljes kód?
    mondjuk szerintem a Pandas partícionálja furán az adatokat és csak minden második lesz szekció, és minden páratlan meg alszekció (vagymi).

    %matplotlib inline
    import matplotlib.pyplot as plt

    Még ennyi tartozik hozzá.

    MOD
    Én nem jöttem rá, asszem el is fogom engedni.

  • sztanozs
    veterán

    plt.rcParams["figure.figsize"] = (20,3)

    Ez például szépen széthúzza, de így sincsenek feliratok.

    biztos ez a teljes kód?
    mondjuk szerintem a Pandas partícionálja furán az adatokat és csak minden második lesz szekció, és minden páratlan meg alszekció (vagymi).

  • kutga
    félisten

    De lehet: [link]
    Vigyázat, a méret nem pixelben, hanem inch-ben megadandó.

    plt.rcParams["figure.figsize"] = (20,3)

    Ez például szépen széthúzza, de így sincsenek feliratok.

  • sztanozs
    veterán

    Rendben, de nem lehet akkor szélesebbre venni?

    De lehet: [link]
    Vigyázat, a méret nem pixelben, hanem inch-ben megadandó.

  • sztanozs
    veterán

    Hölgyek/Urak!

    Iskolában ismerkedünk a python programozással, van egy dolog, amire viszont sehogy sem jövök rá.

    A feladat lényege, hogy egy .csv fájlból kell dátum (év/hó) és hozzá tartozó utasszám adatokat beolvasni, majd idősoron ábrázolni.

    Bemásolom a kódot, ahogy én oldottam meg:

    import datetime
    import matplotlib
    import os
    ldir=os.chdir(r'd:\gyakorlat')
    import pandas as pd
    df = pd.read_csv(r'airline-passengers.csv',delimiter = ",",encoding="ISO-8859-2",parse_dates=['Month'])
    df=df.set_index('Month')
    df['Passengers'].plot()
    plt.xlabel('Year')
    plt.ylabel('Count')
    plt.title('Line chart of Airline passangers')
    x1=datetime.datetime(1948,1,1)
    x2=datetime.datetime(1962,1,1)
    plt.xlim(x1,x2)

    A kimenet az alábbi:

    alt="" title=""

    Amire nem jövök rá, hogy az x tengelyen miért csak a páratlan évszámokat mutatja, a párosokat miért nem?

    Gondolom nem fér el mind, kis segítség: [link]

  • kutga
    félisten

    Hölgyek/Urak!

    Iskolában ismerkedünk a python programozással, van egy dolog, amire viszont sehogy sem jövök rá.

    A feladat lényege, hogy egy .csv fájlból kell dátum (év/hó) és hozzá tartozó utasszám adatokat beolvasni, majd idősoron ábrázolni.

    Bemásolom a kódot, ahogy én oldottam meg:

    import datetime
    import matplotlib
    import os
    ldir=os.chdir(r'd:\gyakorlat')
    import pandas as pd
    df = pd.read_csv(r'airline-passengers.csv',delimiter = ",",encoding="ISO-8859-2",parse_dates=['Month'])
    df=df.set_index('Month')
    df['Passengers'].plot()
    plt.xlabel('Year')
    plt.ylabel('Count')
    plt.title('Line chart of Airline passangers')
    x1=datetime.datetime(1948,1,1)
    x2=datetime.datetime(1962,1,1)
    plt.xlim(x1,x2)

    A kimenet az alábbi:

    alt="" title=""

    Amire nem jövök rá, hogy az x tengelyen miért csak a páratlan évszámokat mutatja, a párosokat miért nem?

  • cog777
    őstag

    de van vmi aktív csekkelő rá, vagy mondjuk 1 másodpercenként olvastatni kell :F

    Lehet hogy van fajl rendszer monitorozo, de szerintem az 1mp-es csekkelo sem ordogtol valo. Az oprendszer ugy is cache-i a gyakran olvasott fajlokat.

  • justmemory
    senior tag

    Fixme, de a GIL miatt, ha csak threadeket indít, nem fogja kifagyasztani a GUI-t is?

    Jó kérdés és nem is gondoltam erre; régen írtam egy gtk gui-s progit, ami a telefon (nokia n900) kamerájának a képét használta/adta be folyamatosan, gombnyomásra, majd gombnyomásra kikapcsolta; ott nem fagyott meg a GUI... De most, hogy mondod, mintha lett volna az elején valami gondom ezzel a fagyás dologgal, de valahogyan ezek szerint meg lehetett oldani. Elő kellene túrnom... Sry, javítsatok ki.

  • RedHarlow
    aktív tag

    Define egyszerű. Ha csak beépített csomagokat használsz, (nagy valószínűséggel) igen, ez a scriptnyelvek nagy előnye, hogy bárhol futtathatók, ahol van interpreter

    Egy xml elemeit szeretném egy új xml-be másolni az általam megadott feltételek alapján.

  • concret_hp
    addikt

    Vagy beolvasod hogy a tartalma 1 vagy semmi. Mielott elinditod a processt, nullazod a tartalmat.

    de van vmi aktív csekkelő rá, vagy mondjuk 1 másodpercenként olvastatni kell :F

  • Silεncε
    őstag

    Sziasztok, kezdő kérdésem lenne, ha windows-on pycharm-ban írok egy egyszerű programot, az unix/linux-ra átmásolva (ha ott is telepítve van a python) ugyan úgy futtatható? Vagy szükséges lesz bármiféle módosításra?

    Define egyszerű. Ha csak beépített csomagokat használsz, (nagy valószínűséggel) igen, ez a scriptnyelvek nagy előnye, hogy bárhol futtathatók, ahol van interpreter

  • RedHarlow
    aktív tag

    Sziasztok, kezdő kérdésem lenne, ha windows-on pycharm-ban írok egy egyszerű programot, az unix/linux-ra átmásolva (ha ott is telepítve van a python) ugyan úgy futtatható? Vagy szükséges lesz bármiféle módosításra?

  • kovisoft
    őstag

    szia kovisoft, köszi a megoldást, valami hasonlóra gondoltam igen, leírom pontosan a várt végeredményt:

    rendelésfelvétel napja : 2020.11.15
    kiszállítás napja: 2020.11.19 Csütörtök

    a rendelésfelvétel napja adott az import datetime-ból, ezután az input("kiszállítás napja: ")
    ( ide jönne pl 11.19) és az ahhoz tartozó nap automatikusan. :)

    Ha az input "11.19" formában van, akkor használhatod a már említett strptime()-ot, de ha ennek nem adsz meg évet, akkor az alapból 1900 lesz. Ezért valahogy meg kell adnod az évet is, pl. kiveszed a today()-ből (persze az évváltásra oda kell figyelni):

    > from datetime import datetime
    > year=datetime.today().year
    > shipment="11.19"
    > shipdate=datetime.strptime(str(year)+"."+shipment, "%Y.%m.%d").date()
    > print(shipdate)
    2020-11-19

  • cog777
    őstag

    több mindent akarok indítani de különböző fileokat dolgoznak fel és az output is különböző fileokba megy, szóval nem akasztják egymást, alapvetően a std-re írogatott kiemenetek nem nagyon érdekelnek, bár némi hibatrackelés van belőve.

    szóval a use case kb. az lenne, hogy elindítok egy keretet, van 5-6 gombom, mindegyik elindít egy feldolgozási folyamatot, úgy, hogy a folyamatok egymástól függetlenek, az utolsó lépésük az, hogy írnak egy fileba aminek mindig ugyanaz a neve az adott szálon. tehát tulképp azt is nézhetném, hogy mikor frissült legutóbb az adott file?

    Vagy beolvasod hogy a tartalma 1 vagy semmi. Mielott elinditod a processt, nullazod a tartalmat.

  • justmemory
    senior tag

    több mindent akarok indítani de különböző fileokat dolgoznak fel és az output is különböző fileokba megy, szóval nem akasztják egymást, alapvetően a std-re írogatott kiemenetek nem nagyon érdekelnek, bár némi hibatrackelés van belőve.

    szóval a use case kb. az lenne, hogy elindítok egy keretet, van 5-6 gombom, mindegyik elindít egy feldolgozási folyamatot, úgy, hogy a folyamatok egymástól függetlenek, az utolsó lépésük az, hogy írnak egy fileba aminek mindig ugyanaz a neve az adott szálon. tehát tulképp azt is nézhetném, hogy mikor frissült legutóbb az adott file?

    Threading nem lenne megoldás...?

  • concret_hp
    addikt

    Tobb lehetoseg is van.
    Ha a scripteket egyesevel inditod, akkor a subprocess.Popen-nel konnyen lehet olvasni a kimenetet a scripteknek. Itt van egy pelda: [link]

    Viszont, ha tobbet akarsz a foprogram blokkolasa nelkul inditani, akkor az tobb melo. Egeszen hosszan eldiskuralnak rola [link] .

    Tovabba egyszeru megoldas a fajlon keresztuli kommunikacio (nem vicc, linux alatt a /tmp-t lehet memoriaba tenni es nagyon gyors elerest tesz lehetove, illetve lock fajlokat is lehet alkalmazni ha nem csak 0/1-et irsz bele), minden process kapna egy sajat fajlt hogy tudja jelezni mikor vegzett.

    Azon kivul lehet TCP-n kereszul kommunikalni veluk, pythonban ez is eleg egyszeru.

    több mindent akarok indítani de különböző fileokat dolgoznak fel és az output is különböző fileokba megy, szóval nem akasztják egymást, alapvetően a std-re írogatott kiemenetek nem nagyon érdekelnek, bár némi hibatrackelés van belőve.

    szóval a use case kb. az lenne, hogy elindítok egy keretet, van 5-6 gombom, mindegyik elindít egy feldolgozási folyamatot, úgy, hogy a folyamatok egymástól függetlenek, az utolsó lépésük az, hogy írnak egy fileba aminek mindig ugyanaz a neve az adott szálon. tehát tulképp azt is nézhetném, hogy mikor frissült legutóbb az adott file?

  • Jhuzaka
    újonc

    Nem biztos, hogy pontosan megértettem, mit szeretnél, de ha a rendelésfelvétel napja egy dátum objektumban van, és szeretnéd az inputként megadott hónapot és napot is dátummá konvertálni, akkor használhatod a datetime.date()-et (az aktuális évet ki lehet szedni a datetime.datetime.today().year-ből):

    > import datetime
    > x=datetime.date(2020,11,13)
    > print(x)
    2020-11-13

    Vagy ha formattált dátum stringből szeretnél date-et csinálni, akkor az strptime()-ot:

    > y=datetime.datetime.strptime("2020.11.23", "%Y.%m.%d").date()
    > print(y)
    2020-11-23


    Két dátum különbségét kivonással kapod:

    > print((y-x).days)
    10

    szia kovisoft, köszi a megoldást, valami hasonlóra gondoltam igen, leírom pontosan a várt végeredményt:

    rendelésfelvétel napja : 2020.11.15
    kiszállítás napja: 2020.11.19 Csütörtök

    a rendelésfelvétel napja adott az import datetime-ból, ezután az input("kiszállítás napja: ")
    ( ide jönne pl 11.19) és az ahhoz tartozó nap automatikusan. :)

  • cog777
    őstag

    na végre volt időm kicsit foglalkozni vele, egy dologra nincs ötletem. tegyük fel, csinálok egy olyat, hogy van mondjuk 5-6 gomb, mindegyik elindít 1-1 py scriptet (háttérben mondjuk firissít valamit, ami 2-10 perc alatt fut le) arról hogyan tudok valami jelzést adni a fő keretnek, hogy az X script végzett?

    Tobb lehetoseg is van.
    Ha a scripteket egyesevel inditod, akkor a subprocess.Popen-nel konnyen lehet olvasni a kimenetet a scripteknek. Itt van egy pelda: [link]

    Viszont, ha tobbet akarsz a foprogram blokkolasa nelkul inditani, akkor az tobb melo. Egeszen hosszan eldiskuralnak rola [link] .

    Tovabba egyszeru megoldas a fajlon keresztuli kommunikacio (nem vicc, linux alatt a /tmp-t lehet memoriaba tenni es nagyon gyors elerest tesz lehetove, illetve lock fajlokat is lehet alkalmazni ha nem csak 0/1-et irsz bele), minden process kapna egy sajat fajlt hogy tudja jelezni mikor vegzett.

    Azon kivul lehet TCP-n kereszul kommunikalni veluk, pythonban ez is eleg egyszeru.

  • concret_hp
    addikt

    Én ezt a kettőt ismerem. a PyQt-t használtam ~4 éve, akkor egész jónak tűnt, bár olyan nagyon mélyen nem mentem bele.

    na végre volt időm kicsit foglalkozni vele, egy dologra nincs ötletem. tegyük fel, csinálok egy olyat, hogy van mondjuk 5-6 gomb, mindegyik elindít 1-1 py scriptet (háttérben mondjuk firissít valamit, ami 2-10 perc alatt fut le) arról hogyan tudok valami jelzést adni a fő keretnek, hogy az X script végzett?

  • kovisoft
    őstag

    Üdv :)
    kezdő PYTHON programozó az alábbit szeretné meghúzni:

    adott 1 rendelésfelvételre írt kódrészlet, amivel a rendelő adatait venném fel elsősorban, továbbá mennyi ládát, milyen minőségű terméket vásárolna., majd minden fontos adatot később szeretnék nyomtathatóvá tenni.ez a kódrészlet egy bizonyos fokig már fut, viszont elakadtam:

    azt szeretném, hogy a rendelésfelvétel napja, és a kiszállítás napja közti értéket ki tudjam iratni úgy, hogy sima inputtal bekérem, mikorra szeretné a szállítást, (hónap, nap)
    és ebből a program már hozzárendeli a megfelelő napot.

    bármilyen segítséget megköszönök, köszi a figyelmet, további jó kódolást :)

    Nem biztos, hogy pontosan megértettem, mit szeretnél, de ha a rendelésfelvétel napja egy dátum objektumban van, és szeretnéd az inputként megadott hónapot és napot is dátummá konvertálni, akkor használhatod a datetime.date()-et (az aktuális évet ki lehet szedni a datetime.datetime.today().year-ből):

    > import datetime
    > x=datetime.date(2020,11,13)
    > print(x)
    2020-11-13

    Vagy ha formattált dátum stringből szeretnél date-et csinálni, akkor az strptime()-ot:

    > y=datetime.datetime.strptime("2020.11.23", "%Y.%m.%d").date()
    > print(y)
    2020-11-23


    Két dátum különbségét kivonással kapod:

    > print((y-x).days)
    10

  • Jhuzaka
    újonc

    Üdv :)
    kezdő PYTHON programozó az alábbit szeretné meghúzni:

    adott 1 rendelésfelvételre írt kódrészlet, amivel a rendelő adatait venném fel elsősorban, továbbá mennyi ládát, milyen minőségű terméket vásárolna., majd minden fontos adatot később szeretnék nyomtathatóvá tenni.ez a kódrészlet egy bizonyos fokig már fut, viszont elakadtam:

    azt szeretném, hogy a rendelésfelvétel napja, és a kiszállítás napja közti értéket ki tudjam iratni úgy, hogy sima inputtal bekérem, mikorra szeretné a szállítást, (hónap, nap)
    és ebből a program már hozzárendeli a megfelelő napot.

    bármilyen segítséget megköszönök, köszi a figyelmet, további jó kódolást :)

  • cousin333
    addikt

    Sziasztok! Egy kis segítséget szeretnék kérni. Arduinoval szeretnék soros porton kommunikálni pythonon keresztül. importáltam pyseial-t de folyamatosan: "AttributeError: partially initialized module 'serial' has no attribute 'Serial' (most likely due to a circular import)" hibát kapom .Google féle segítségeket már próbáltam, serial modul letelepítés, pyserial újratelepítés..stb Remélem valaki találkozott már vele és tudja a megoldást. :R
    köszönöm.

    Szóval, ha jól értem, PC-re telepítetted a pyserial-t. Milyen Python (verzió, honnan telepítetted)? Milyen pyserial verzió és hogyan telepítetted?

    Elvileg a hivatalos Python disztribúciónak (mondjuk Python 3.7, 3.8 vagy 3.9) simán működnie kellene ha pip-el felteszed a pyserial-t:
    pip install pyserial

    Bocs, ha valami triviálisat írtam, de valahol el kell kezdeni...

  • xAttilax
    őstag

    Sziasztok! Egy kis segítséget szeretnék kérni. Arduinoval szeretnék soros porton kommunikálni pythonon keresztül. importáltam pyseial-t de folyamatosan: "AttributeError: partially initialized module 'serial' has no attribute 'Serial' (most likely due to a circular import)" hibát kapom .Google féle segítségeket már próbáltam, serial modul letelepítés, pyserial újratelepítés..stb Remélem valaki találkozott már vele és tudja a megoldást. :R
    köszönöm.

  • I02S3F
    addikt

    tkinter iszonyat rondán néz ki, viszont nem kell hozzá telepíteni semmit. További hátránya, hogy ha bármi funkcióra van szükséged a táblázattal kapcsolatban, neked kell megvalósítani.
    PyQT licenszre oda kell figyelni, illetve ott a PyGObject, mindkettőt telepítened kell, ám kb. mindent készen kapsz: sorbarendezés, stb. Van grafikus felületű tervező hozzájuk.
    Szerintem a wxpython sem rossz, bár azt még éppen hogy csak használtam, egy fájlkiválasztó ablakot készítettem vele. :D

    Nehogy zavarba jöjjön a bőségtől, amit ajánlottatok neki :)

  • Siriusb
    veterán

    köszi, nem ismerem egyiket sem, a google meg vagy 10et ad ki, de ugye chartcsinálóból is van sok lib... szóval ez a 2 az ajánlotT?

    tkinter iszonyat rondán néz ki, viszont nem kell hozzá telepíteni semmit. További hátránya, hogy ha bármi funkcióra van szükséged a táblázattal kapcsolatban, neked kell megvalósítani.
    PyQT licenszre oda kell figyelni, illetve ott a PyGObject, mindkettőt telepítened kell, ám kb. mindent készen kapsz: sorbarendezés, stb. Van grafikus felületű tervező hozzájuk.
    Szerintem a wxpython sem rossz, bár azt még éppen hogy csak használtam, egy fájlkiválasztó ablakot készítettem vele. :D

  • cog777
    őstag

    valami windowsos keretrendszer szerű valamit tudtok ajánlani?
    kb. egy olyat szeretnék csinálni, hogy egy adatbázisból kiszippantok egy pár sornyi dolgot (ez megy), és mondjuk minden sorhoz beírok egy számot egy windowsos progival / bepipálok egy jelölő négyzetet és azt utána lerakom vissza az adatbázisba (ez is menni fog vélhetően)

    szóval gyakorlatilag egy táblázatot kéne megjeleníteni egy ablakban amiben vannak klikkelhető linkek és a valami inputot hozzá tud rakni a táblázathoz. az, hogy szépen nézzen ki az nem szempont

    Kivy-t is megnezheted.

  • Silεncε
    őstag

    köszi, nem ismerem egyiket sem, a google meg vagy 10et ad ki, de ugye chartcsinálóból is van sok lib... szóval ez a 2 az ajánlotT?

    Én ezt a kettőt ismerem. a PyQt-t használtam ~4 éve, akkor egész jónak tűnt, bár olyan nagyon mélyen nem mentem bele.

  • concret_hp
    addikt

    köszi, nem ismerem egyiket sem, a google meg vagy 10et ad ki, de ugye chartcsinálóból is van sok lib... szóval ez a 2 az ajánlotT?

  • Silεncε
    őstag

    valami windowsos keretrendszer szerű valamit tudtok ajánlani?
    kb. egy olyat szeretnék csinálni, hogy egy adatbázisból kiszippantok egy pár sornyi dolgot (ez megy), és mondjuk minden sorhoz beírok egy számot egy windowsos progival / bepipálok egy jelölő négyzetet és azt utána lerakom vissza az adatbázisba (ez is menni fog vélhetően)

    szóval gyakorlatilag egy táblázatot kéne megjeleníteni egy ablakban amiben vannak klikkelhető linkek és a valami inputot hozzá tud rakni a táblázathoz. az, hogy szépen nézzen ki az nem szempont

    Tkinter, PyQt?

  • concret_hp
    addikt

    valami windowsos keretrendszer szerű valamit tudtok ajánlani?
    kb. egy olyat szeretnék csinálni, hogy egy adatbázisból kiszippantok egy pár sornyi dolgot (ez megy), és mondjuk minden sorhoz beírok egy számot egy windowsos progival / bepipálok egy jelölő négyzetet és azt utána lerakom vissza az adatbázisba (ez is menni fog vélhetően)

    szóval gyakorlatilag egy táblázatot kéne megjeleníteni egy ablakban amiben vannak klikkelhető linkek és a valami inputot hozzá tud rakni a táblázathoz. az, hogy szépen nézzen ki az nem szempont

  • Sziasztok!

    Van egy felesleges, 2 hónapig működő JetBrains PyCharm Professional Edition kódom. (Be kell hozzá regisztrálni)
    Akit érdekel esetleg, dobjon egy PÜ-t, az első jelentkezőnek küldöm.

  • sztanozs
    veterán

    A devel-t raktam fel, és nem oldotta meg. Pedig volt terminál újraindítás is.

    Lehet, hogy valami már kehes a Fedora installommal. Megvan vagy 4 éve, és félévente rátolom az új verziót. Lehet, hogy valami összegubancolódott az évek során, ami eddig nem jött ki.

    biztos pip3 install-t írtál és nem pip install-t?
    mert ha van va fent python 2 és pyton 3 is, akkor a sima pip python 2-höz akarja leszedni a cuccot...

  • Bici
    félisten

    Pedig a hibán 100% segít a python3 developer csomag felrakása. Nekem is volt ilyen gondom rengetegszer, hogy hiányolta a Python.h fejlécet. Viszont fedora alatt van egy csavar, nem python3-dev, hanem python3-devel a csomagnév:

    dnf install python3-devel

    De ha a conda megoldotta, nincs gond. :)

    A devel-t raktam fel, és nem oldotta meg. Pedig volt terminál újraindítás is.

    Lehet, hogy valami már kehes a Fedora installommal. Megvan vagy 4 éve, és félévente rátolom az új verziót. Lehet, hogy valami összegubancolódott az évek során, ami eddig nem jött ki.

  • Mr Dini
    addikt

    Sziasztok!

    Egy (számotokra) valószínűleg szög egyszerű kérdésem lenne.
    Egy python modult szeretnék installálni, de nem megy.

    [link]

    Ugyanezt kapom a pip install bsdiff4 parancsra is.
    Fedora linux.

    Van valami varázslat, amivel megoldható?

    Pedig a hibán 100% segít a python3 developer csomag felrakása. Nekem is volt ilyen gondom rengetegszer, hogy hiányolta a Python.h fejlécet. Viszont fedora alatt van egy csavar, nem python3-dev, hanem python3-devel a csomagnév:

    dnf install python3-devel

    De ha a conda megoldotta, nincs gond. :)

  • I02S3F
    addikt

    Ez a conda egy nagyon jó cucc. :K
    Nem egyszerűen de sikerült vele megoldani a gondod.
    Köszönöm szépen! :R

    (#2860) sonar: Igen, a legújabb.
    A fedora nálam mindig hibátlanul ment, egyszer belefér, hogy ne menjen rajta valami pöccre. :DDD

    Nincs mit! Nekem is tetszik! :)

  • Bici
    félisten

    Futottam bele hasonlóba. Én a az anacondával oldottam meg. conda install xy

    Ez a conda egy nagyon jó cucc. :K
    Nem egyszerűen de sikerült vele megoldani a gondod.
    Köszönöm szépen! :R

    (#2860) sonar: Igen, a legújabb.
    A fedora nálam mindig hibátlanul ment, egyszer belefér, hogy ne menjen rajta valami pöccre. :DDD

  • sonar
    addikt

    Sanos nem nyert. :(

    Abszolút csak tipp, setuptools-ból a legutolsó van fent?
    pip3 install --upgrade setuptools

    Nálam simán felment.
    OS:Mint 20
    python3.8
    $ pip3 install --upgrade bsdiff4
    Collecting bsdiff4
    Downloading bsdiff4-1.2.0.tar.gz (11 kB)
    Building wheels for collected packages: bsdiff4
    Building wheel for bsdiff4 (setup.py) ... done
    Created wheel for bsdiff4: filename=bsdiff4-1.2.0-cp38-cp38-linux_x86_64.whl size=35156 sha256=312ae5bb454bbcd2b4e9064d34705924d4d3b5080846ca876e7e95b096c51a2e
    Stored in directory: /home/sonar/.cache/pip/wheels/e6/ea/4f/2df7010b3c81ef36bfc0fa6fc0c62a7598c0b808ac1f253de0
    Successfully built bsdiff4
    Installing collected packages: bsdiff4
    Successfully installed bsdiff4-1.2.0

  • sonar
    addikt

    Sziasztok!

    Egy (számotokra) valószínűleg szög egyszerű kérdésem lenne.
    Egy python modult szeretnék installálni, de nem megy.

    [link]

    Ugyanezt kapom a pip install bsdiff4 parancsra is.
    Fedora linux.

    Van valami varázslat, amivel megoldható?

    Nem 100%, de próbáld meg feltenni python3-dev -et csomagkezelőből (dnf, yum)

  • Bici
    félisten

    Sziasztok!

    Egy (számotokra) valószínűleg szög egyszerű kérdésem lenne.
    Egy python modult szeretnék installálni, de nem megy.

    [link]

    Ugyanezt kapom a pip install bsdiff4 parancsra is.
    Fedora linux.

    Van valami varázslat, amivel megoldható?

  • concret_hp
    addikt

    unicodedata.normalize('NFKD', s).encode('ascii', 'ignore').decode('utf-8')
    'ou'
    unicodedata.normalize('NFKD', s).encode('ascii', 'ignore').decode('utf-8') == 'ou'
    True

    ez lett a tuti, köszi ;)

  • kovisoft
    őstag

    es ebbol mivel lesz megint string? str() azt jovan? (most pont nem vagyok gep elott)

    unicodedata.normalize('NFKD', s).encode('ascii', 'ignore').decode('utf-8')
    'ou'
    unicodedata.normalize('NFKD', s).encode('ascii', 'ignore').decode('utf-8') == 'ou'
    True

  • concret_hp
    addikt

    Ez más miatt false, ugyanis az encode nem stringet ad vissza:

    import unicodedata
    s='óú'
    unicodedata.normalize('NFKD', s).encode('ascii', 'ignore')
    b'ou'
    unicodedata.normalize('NFKD', s).encode('ascii', 'ignore') == 'ou'
    False
    unicodedata.normalize('NFKD', s).encode('ascii', 'ignore') == b'ou'
    True

    es ebbol mivel lesz megint string? str() azt jovan? (most pont nem vagyok gep elott)

  • Cucuska2
    addikt

    s = 'őú'
    unicodedata.normalize('NFKD', s).encode('ascii','ignore') == 'ou'

    ez simán false

    és a gond, hogy nem tudom előre milyen karakterek vannak pontosan, persze egy 40-50 karakteres listát lehet csinálni ami nagyjából lefedi, csak nem nagyjából kéne, hanem pontosan :DDD

    Ha nem online csinálod, akkor pedig a kézzel írt lista egy nagyon jó megoldás. Ígyis, úgyis kell betűstatisztikákat csinálnod önellenőrzésre.

  • kovisoft
    őstag

    s = 'őú'
    unicodedata.normalize('NFKD', s).encode('ascii','ignore') == 'ou'

    ez simán false

    és a gond, hogy nem tudom előre milyen karakterek vannak pontosan, persze egy 40-50 karakteres listát lehet csinálni ami nagyjából lefedi, csak nem nagyjából kéne, hanem pontosan :DDD

    Ez más miatt false, ugyanis az encode nem stringet ad vissza:

    import unicodedata
    s='óú'
    unicodedata.normalize('NFKD', s).encode('ascii', 'ignore')
    b'ou'
    unicodedata.normalize('NFKD', s).encode('ascii', 'ignore') == 'ou'
    False
    unicodedata.normalize('NFKD', s).encode('ascii', 'ignore') == b'ou'
    True

  • concret_hp
    addikt
    A megválaszolt hozzászólás már nem elérhető.

    s = 'őú'
    unicodedata.normalize('NFKD', s).encode('ascii','ignore') == 'ou'

    ez simán false

    és a gond, hogy nem tudom előre milyen karakterek vannak pontosan, persze egy 40-50 karakteres listát lehet csinálni ami nagyjából lefedi, csak nem nagyjából kéne, hanem pontosan :DDD

  • Silεncε
    őstag

    A cserelendo -be felveszed mit szeretnél cserélni, a mire -be hogy mire:
    szoveg = "Árvíztűrő tükÖrfúrógép"
    cserelendo = ("áéóúüűöőíÁÉÓÚÜŰÖŐÍ")
    mire = ("aeouuuooiAEOUUUOOI")
    for betu in list(szoveg):
        if betu in cserelendo:
            while betu in szoveg:
                hanyadik = cserelendo.index(betu)
                szoveg = [b.replace(betu, mire[hanyadik]) for b in szoveg]
    print("".join(szoveg))

    Biztosan van jobb megoldás, de talán ez is használható.
    Ahogy elnézem nincsen rá "általános" megoldás. Talán ez hasonlít rá legjobban:
    https://stackoverflow.com/questions/8689795/how-can-i-remove-non-ascii-characters-but-leave-periods-and-spaces-using-python

    Na igen, csak itt nem tudja pontosan, milyen karakterek lehetnek, az összes nem ASCII karakterre meg kicsit sok idő lenne a táblázatot felírni

  • arra van valami stabil megoldásotok, hogy minden ékezetes meg egyéb non-english karaktert átalakítani a hozzá legközelebb angol karakterré?
    szóval pl:
    ű -> u
    č -> c
    ž -> z

    A cserelendo -be felveszed mit szeretnél cserélni, a mire -be hogy mire:
    szoveg = "Árvíztűrő tükÖrfúrógép"
    cserelendo = ("áéóúüűöőíÁÉÓÚÜŰÖŐÍ")
    mire = ("aeouuuooiAEOUUUOOI")
    for betu in list(szoveg):
        if betu in cserelendo:
            while betu in szoveg:
                hanyadik = cserelendo.index(betu)
                szoveg = [b.replace(betu, mire[hanyadik]) for b in szoveg]
    print("".join(szoveg))

    Biztosan van jobb megoldás, de talán ez is használható.
    Ahogy elnézem nincsen rá "általános" megoldás. Talán ez hasonlít rá legjobban:
    https://stackoverflow.com/questions/8689795/how-can-i-remove-non-ascii-characters-but-leave-periods-and-spaces-using-python

  • concret_hp
    addikt

    ez majdnem jó, igaz hogy nem írtam le pontosan, de utána összehasonlításra is használnám arra meg nem jó :(

    "Even if two unicode strings are normalized and look the same to a human reader, if one has combining characters and the other doesn’t, they may not compare equal."

    szóval azt kéne megoldanom, hogy van N darab forrás szövegem, amiben néha van ékezet, meg ilyen olyan kalapos meg mindenféle betűk, néha meg nincs.

  • kovisoft
    őstag

    arra van valami stabil megoldásotok, hogy minden ékezetes meg egyéb non-english karaktert átalakítani a hozzá legközelebb angol karakterré?
    szóval pl:
    ű -> u
    č -> c
    ž -> z

    Nézd meg ezt.

  • concret_hp
    addikt

    arra van valami stabil megoldásotok, hogy minden ékezetes meg egyéb non-english karaktert átalakítani a hozzá legközelebb angol karakterré?
    szóval pl:
    ű -> u
    č -> c
    ž -> z

  • cousin333
    addikt

    No akkor most ismét nekiállok megírni a hsz-t. Tegnap du. emiatt a warning miatt elveszett amit írtam...
    Köszi az ötletet, nekiálltam a NamedTuple-t használni. Egyelőre a következő két függvényemben:
    def i2c_io_namer(i2c_io_readed_array_reversed):
        global MICROSWITCH_COUNT
        MICROSWITCH_COUNT = 4
        global MICROBUTTON_COUNT
        MICROBUTTON_COUNT = 2
        global NC_COUNT
        NC_COUNT = 2
        i2c_io_pinout = namedtuple('I2C_IO_PortA', ['Switch1', 'Switch2', 'Switch3', 'Switch4',
            'Button1', 'Button2', 'NC7', 'NC8'])
        # sample: i2c_io_readed_array: [True, True, True, True, False, True, False, False]
        i2c_io_state = i2c_io_pinout(*i2c_io_readed_array_reversed) 
        return i2c_io_state
    def i2c_io_printer(i2c_io_readed_array_reversed, i2c_io_state):
        global i2c_io_readed_array_reversed_previous
        print("----")
        print("I2C_IO portA állapot:", i2c_io_readed_array_reversed)
        # for y in range(len(i2c_io_readed_array_reversed)):
            # print ("I2C_IO_PortA: pin", y+1, "actual value: ", i2c_io_readed_array_reversed[y])
        print("Port állapot tuple adattípussal: ")
        print(i2c_io_state)
        print("Kapcsolók állapota: ", i2c_io_state[0:MICROSWITCH_COUNT])
        print("Nyomógombok állapota: ", i2c_io_state[MICROSWITCH_COUNT:(MICROSWITCH_COUNT+MICROBUTTON_COUNT)])
        print("Nem használt pinek állapota: ", i2c_io_state[(MICROSWITCH_COUNT+MICROBUTTON_COUNT):(MICROSWITCH_COUNT+MICROBUTTON_COUNT+NC_COUNT)])
        for i in range(len(i2c_io_readed_array_reversed)):
            if (i2c_io_readed_array_reversed[i] != i2c_io_readed_array_reversed_previous[i]):
                print("--")
                print("Változás az IO bemeneteken: I2C_IO Pin number", i, ": from", i2c_io_readed_array_reversed_previous[i], "to", i2c_io_readed_array_reversed[i])
                i2c_io_readed_array_reversed_previous = i2c_io_readed_array_reversed

    Ami plusz, hogy ennek az I2C-s IO modulnak (PCF8574) van egy Interrupt kimenete is. És ezt most bekötöttem a Raspberry Pi egyik GPIO bemenetére, és szeretném használni.
    Ez az Interrupt Pin akkor változik meg (1-ről 0-ba megy), ha változás történt a PCF8574 bármelyik bemenetén.
    A Raspberry-n csak ezt az egy GPIO pint-t figyelném pollingolással, és csak akkor állnék neki I2C-n keresztül kiolvasni az aktuális értékeket, ha bármelyikben egy változás volt.
    Maga a funkció működik (bár valamiért kicsit "lassan" áll vissza miután csináltam egy kiolvasást, de a célnak most ez mégis megfelel, a gyakorlatban úgy néz ki). De ez az átalakítás még folyamatban van a programkódomban.

    De sajnos a korábbi értékkel való összehasonlítást sem tudtam még megoldani a tuple-ön keresztül.
    Van amit nem értek még teljesen róla.

    Az i2c_io_pinout = namedtuple ... utasítással jól gondolom, hogy én egy "i2c_io_pinout" típust hozok létre ?
    És utána a i2c_io_state = i2c_io_pinout(*i2c_io_readed_array_reversed) pedig létrehoz egy i2c_io_pinout típusú "változóból"(mi itt erre a helyes szó?) egy konkrét példányt ?

    Hogy tudnék elérni egy adott számú "kulcsnevet" ?
    Tehát nem hogy mi az értéke, hanem hogy mi a neve az i -edik elemnek. ("Switch2" vagy "Button1" , stb.)
    Az i2c_io_state[i] az értéket adja meg csak sajnos.
    A i2c_io_pinout[i] pedig hibát dob, hogy ez egy nem iterálható típus.

    A namedtuple egy "gyártó függvény" (factory function), aminek az eredménye ebben az esetben egy osztály lesz (mintha mondjuk nem kellene megírnod a Kör osztályt előre, hanem futás közben dinamikusan hoznád létre). Az i2c_io_pinout tehát lényegében egy osztály (amit talán elegánsabb lenne ennek megfelelően camel-case-el jelölni: pl. I2cIoPinout), az i2c_io_state meg valóban egy példány.

    Az adott számú "kulcsnevet" vagy az eredeti elnevezés tömbbel éred el, vagy a _fields paraméterrel. Pl.:

    i2c_io_state._fields[1]

    Őszintén szólva nem tudom, mire kell, de nekem az a véleményem, hogy ha ezt akarod elérni, akkor nem jól használod a típust, hiszen ez pont arra lenne jó, hogy ne kelljen ismerni a sorrendet a létrehozást követően.

    Alapvetően én az egész külső IC-nek egy osztályt hoznék létre, hasonlóan a már létező I2C, SPI... stb. osztályokhoz, ami aztán minden létező funkciót egy névtérbe "csomagol". Valami ilyesmi struktúrával:

    class IoModule(object):

        MASK_SWITCH1 = 0x30

        def __init__(self, interface):
            self.port = interface
          self.portA_status = None
          self.portB_status = None

        def connect(self):
            .... # connect here

        def close(self):
            self.port.close()

        def update_ports(self):
          self.portA_status = self.port.read(<reg_portA>)
    self.portB_status = self.port.read(<reg_portB>)

      def compare_portA(self):
            port_old = self.portA_status
            self.update_ports()
            port = self.portA_status

            return port & port_old

        @property
        def id(self):
            return self.port.read(<id_reg>)

        @property
        def Switch1(self):
            return True if self.port_status & self.MASK_SWITCH else False

    Ebben az esetben az osztályunk példányosításkor megkapja az interfészt (ami ebben az esetben egy I2C objektum), és azt használja a továbbiakban. A fenti kód elég kezdetleges, csak a struktúrát akartam megmutatni.

    ui: ha listaelemeken akarsz végigmenni, akkor ne használd a range(len(x)) formulát. Ha az elem kell, akkor

    for elem in lista:
        print(elem)

    Ha kell a sorszám is, akkor enumerate:

    for i, elem in enumerate(lista):
        print('Az', i, 'elem a(z)', elem)

    Ha pedig több egyforma listád van, akkor zip:

    for elemA, elemB in zip(listaA, listaB):
        print('Az A eleme:', elemA, 'a B eleme pedig:', elemB)

  • atesss
    addikt

    Közben bedobnám ide is a másik problémámat, amit egyelőre én eléggé X-akták jelenségként tudtam csak beazonosítani...
    Az Arduino-s topicban kérdeztem rá eredetileg, mert az első sejtésemmel a PCF8574 modul hibájára/hiányosságára gondoltam.
    Közben felmerültek elektronikai problémák is, van ami jogos is, de a programkóddal való "megoldást" ezek még nem magyaráznák meg.
    A teljes téma: [link]
    És ebből egy tesztem, hogy konkrétan milyen teljes függvényben mely sorok megléte/nem megléte okoz furcsa különbséget: [link]

    Tehát a köztes if szerkezetbe rakott parancsok közül például egy olyan amivel még mindig előjön a hibás működés:
    if len(i2c_io_readed_array) == 8:
    print("az előző kiolvasás megfelelően megfordított értéke: ", i2c_io_readed_array_reversed)
    teszt = i2c_io_readed_array
    És egy olyan amivel már nem:
    if len(i2c_io_readed_array) == 8:
    teszt = i2c_io_readed_array
    print("A beolvasott port tömbje egy külön [teszt] nevű változóba átmásolva: ", teszt)
    Meg meg egy olyan, amivel már nem:
    if len(i2c_io_readed_array) == 8:
    print("PCF8574 Port beolvasva. A beolvasott port tömbje:", i2c_io_readed_array)

    Mit tud változtatni az, ha egy már korábban feltöltött tömböt egyszerűen csak kiíratok ??

  • cog777
    őstag

    Ez a megoldás, ahol számol a feladat hosszával, azért elegánsabb.

    Viszont van olyan funkcióm már most is, ahol megadott ideig kell csinálnia periodikusan a feladatot. Konkrétan megadott ideig (a script elején fixen megadom egy úgymond konstans-al, most egyelőre 10 másodperc) kell villogtatnia egy ledet, 300ms-onként. Onnantól kezdve, hogy egy bizonyos feltétel előfordult. Jelen esetben ha "hiba volt".
    Ez erre akart lennie egy megoldási javaslatod ? :
    current_time = datetime.now() f() num_calls += 1 difference = current_time - first_called
    Akkor már ezt is monotonic-al kellene, nem ?

    Asszem nekiállok akkor átírni mindenhol a programomban erre a Timer-es megoldásra.
    Az új, Timer-es függvényeket akkor már mind a time.monotonic()-al csinálom.
    És ha marad még azokon kívül bármi egyéb hely - bár nem nagyon fog valószínű - akkor ott is mind átalakítom a time.time()-ot time.monotonic()-ra.

    igen, lehet monotonic-kal.

  • atesss
    addikt

    Itt kiszamitjuk feladat futasanak idejet es kivonjuk az timer intervallumbol. Garantalva az 5 mp-kent valo futtatast. Feladat: ha tovabb tart a futas mint 5 mp, akkor a maradek ido negativ lesz : maradek_ido
    Erdemes egy if-ben ezt vizsgalni hogy negativ-e es lenullazni a maradek_ido-t

    online python

    import threading
    import time
    from datetime import datetime
    TIMER_INTERVAL = 5.0
    last_hit_ts = 0.0
    def mylog():
        now = datetime.now()
        print(now.strftime("%H:%M:%S.%f"))
        
        # Munka kezdetenek merese
        munka_start = time.monotonic()
        print("Inditjuk a feladatot")
        # 2mp-et vesz igenybe
        time.sleep(2.0)
        # Munka vegenek merese
        munka_end = time.monotonic()
        
        # timer korrekcio
        eltelt_ido = munka_end - munka_start
        maradek_ido = TIMER_INTERVAL - eltelt_ido
        print('Eltelt ido:', eltelt_ido, 'maradek_ido', maradek_ido)
        threading.Timer(maradek_ido, mylog).start()
    mylog()

    Ez a megoldás, ahol számol a feladat hosszával, azért elegánsabb.

    Viszont van olyan funkcióm már most is, ahol megadott ideig kell csinálnia periodikusan a feladatot. Konkrétan megadott ideig (a script elején fixen megadom egy úgymond konstans-al, most egyelőre 10 másodperc) kell villogtatnia egy ledet, 300ms-onként. Onnantól kezdve, hogy egy bizonyos feltétel előfordult. Jelen esetben ha "hiba volt".
    Ez erre akart lennie egy megoldási javaslatod ? :
    current_time = datetime.now() f() num_calls += 1 difference = current_time - first_called
    Akkor már ezt is monotonic-al kellene, nem ?

    Asszem nekiállok akkor átírni mindenhol a programomban erre a Timer-es megoldásra.
    Az új, Timer-es függvényeket akkor már mind a time.monotonic()-al csinálom.
    És ha marad még azokon kívül bármi egyéb hely - bár nem nagyon fog valószínű - akkor ott is mind átalakítom a time.time()-ot time.monotonic()-ra.

  • cog777
    őstag

    Itt kiszamitjuk feladat futasanak idejet es kivonjuk az timer intervallumbol. Garantalva az 5 mp-kent valo futtatast. Feladat: ha tovabb tart a futas mint 5 mp, akkor a maradek ido negativ lesz : maradek_ido
    Erdemes egy if-ben ezt vizsgalni hogy negativ-e es lenullazni a maradek_ido-t

    online python

    import threading
    import time
    from datetime import datetime
    TIMER_INTERVAL = 5.0
    last_hit_ts = 0.0
    def mylog():
        now = datetime.now()
        print(now.strftime("%H:%M:%S.%f"))
        
        # Munka kezdetenek merese
        munka_start = time.monotonic()
        print("Inditjuk a feladatot")
        # 2mp-et vesz igenybe
        time.sleep(2.0)
        # Munka vegenek merese
        munka_end = time.monotonic()
        
        # timer korrekcio
        eltelt_ido = munka_end - munka_start
        maradek_ido = TIMER_INTERVAL - eltelt_ido
        print('Eltelt ido:', eltelt_ido, 'maradek_ido', maradek_ido)
        threading.Timer(maradek_ido, mylog).start()
    mylog()

  • cog777
    őstag

    Egyszeru megoldas, ahol nincs figyelembe veve a feladat hossza, peldaul 2mp-ig tart egy feladat, de 5 masodpercenkent futtatjuk, akkor bizony 7mp-kent fog elindulni a feladat mert nincs beleszamolva annak a hossza:
    link online pythonban
    import threading
    import time
    from datetime import datetime

    def mylog():
        now = datetime.now()
        print(now.strftime("%H:%M:%S.%f"))
        print("Szimulaljuk a munkat")
        time.sleep(2.0)
        threading.Timer(5.0, mylog).start()

    mylog()

    Bocsanat, programkod formazasa nem igazan mukodik.

  • atesss
    addikt

    A mondás szerint akinek kalapácsa van, mindent szögnek néz... :)

    Ebben az esetben én nem használnám a dictionary-t, mert nem erre való. Az a baj vele ugyanis, hogy nem fix az elemek sorrendje - a pin kiosztásod viszont igen (bár létezik OrderedDict).

    Én a helyedben megismerkednék a NamedTuple típussal, illetve nem tudom, hogy hányas Python verziót használsz, de a 3.7-es verzió óta támogatott a DataClass is, ami hasonló céllal (is) készült. Ez utóbbi talán valamivel elegánsabb. Mindkettő a standard könyvtár része.

    from collections import namedtuple
    ...
    Ports = namedtuple('Ports', ['Switch1', 'Switch2', 'Switch3', 'Switch4',
    'Button1', 'Button2', 'NC7', 'NC8'])
    ...
    # i2c_io_readed_array: [True, True, True, True, False, True, False, False]
    port_state = Ports(*i2c_io_readed_array)  # figyelj a csillagra!

    Ilyenkor sorrendben rendeli hozzá az értékeket a címkékhez. Ezek után már egyszerűen tudsz hivatkozni a tömbre, vagy egyes elemeire, valahogy így:

    >>> port_state
    Ports(Switch1=True, Switch2=True, Switch3=True, Switch4=True, Button1=False, Button2=True, NC7=False, NC8=False)

    >>> port_state.Switch2
    True

    Ugyanez dataclass-al:

    from dataclasses import dataclass

    @dataclass
    class InputPorts:
        Switch1: bool
        Switch2: bool
        Switch3: bool
        Switch4: bool
        Button1: bool
        Button2: bool
        NC7: bool
        NC8: bool
    ...
    port_state = InputPorts(*i2c_io_readed_array)

    A használata kb. ugyanaz, mint a namedtuple-nek.

    No akkor most ismét nekiállok megírni a hsz-t. Tegnap du. emiatt a warning miatt elveszett amit írtam...
    Köszi az ötletet, nekiálltam a NamedTuple-t használni. Egyelőre a következő két függvényemben:
    def i2c_io_namer(i2c_io_readed_array_reversed):
        global MICROSWITCH_COUNT
        MICROSWITCH_COUNT = 4
        global MICROBUTTON_COUNT
        MICROBUTTON_COUNT = 2
        global NC_COUNT
        NC_COUNT = 2
        i2c_io_pinout = namedtuple('I2C_IO_PortA', ['Switch1', 'Switch2', 'Switch3', 'Switch4',
            'Button1', 'Button2', 'NC7', 'NC8'])
        # sample: i2c_io_readed_array: [True, True, True, True, False, True, False, False]
        i2c_io_state = i2c_io_pinout(*i2c_io_readed_array_reversed) 
        return i2c_io_state
    def i2c_io_printer(i2c_io_readed_array_reversed, i2c_io_state):
        global i2c_io_readed_array_reversed_previous
        print("----")
        print("I2C_IO portA állapot:", i2c_io_readed_array_reversed)
        # for y in range(len(i2c_io_readed_array_reversed)):
            # print ("I2C_IO_PortA: pin", y+1, "actual value: ", i2c_io_readed_array_reversed[y])
        print("Port állapot tuple adattípussal: ")
        print(i2c_io_state)
        print("Kapcsolók állapota: ", i2c_io_state[0:MICROSWITCH_COUNT])
        print("Nyomógombok állapota: ", i2c_io_state[MICROSWITCH_COUNT:(MICROSWITCH_COUNT+MICROBUTTON_COUNT)])
        print("Nem használt pinek állapota: ", i2c_io_state[(MICROSWITCH_COUNT+MICROBUTTON_COUNT):(MICROSWITCH_COUNT+MICROBUTTON_COUNT+NC_COUNT)])
        for i in range(len(i2c_io_readed_array_reversed)):
            if (i2c_io_readed_array_reversed[i] != i2c_io_readed_array_reversed_previous[i]):
                print("--")
                print("Változás az IO bemeneteken: I2C_IO Pin number", i, ": from", i2c_io_readed_array_reversed_previous[i], "to", i2c_io_readed_array_reversed[i])
                i2c_io_readed_array_reversed_previous = i2c_io_readed_array_reversed

    Ami plusz, hogy ennek az I2C-s IO modulnak (PCF8574) van egy Interrupt kimenete is. És ezt most bekötöttem a Raspberry Pi egyik GPIO bemenetére, és szeretném használni.
    Ez az Interrupt Pin akkor változik meg (1-ről 0-ba megy), ha változás történt a PCF8574 bármelyik bemenetén.
    A Raspberry-n csak ezt az egy GPIO pint-t figyelném pollingolással, és csak akkor állnék neki I2C-n keresztül kiolvasni az aktuális értékeket, ha bármelyikben egy változás volt.
    Maga a funkció működik (bár valamiért kicsit "lassan" áll vissza miután csináltam egy kiolvasást, de a célnak most ez mégis megfelel, a gyakorlatban úgy néz ki). De ez az átalakítás még folyamatban van a programkódomban.

    De sajnos a korábbi értékkel való összehasonlítást sem tudtam még megoldani a tuple-ön keresztül.
    Van amit nem értek még teljesen róla.

    Az i2c_io_pinout = namedtuple ... utasítással jól gondolom, hogy én egy "i2c_io_pinout" típust hozok létre ?
    És utána a i2c_io_state = i2c_io_pinout(*i2c_io_readed_array_reversed) pedig létrehoz egy i2c_io_pinout típusú "változóból"(mi itt erre a helyes szó?) egy konkrét példányt ?

    Hogy tudnék elérni egy adott számú "kulcsnevet" ?
    Tehát nem hogy mi az értéke, hanem hogy mi a neve az i -edik elemnek. ("Switch2" vagy "Button1" , stb.)
    Az i2c_io_state[i] az értéket adja meg csak sajnos.
    A i2c_io_pinout[i] pedig hibát dob, hogy ez egy nem iterálható típus.

  • atesss
    addikt

    A mondás szerint akinek kalapácsa van, mindent szögnek néz... :)

    Ebben az esetben én nem használnám a dictionary-t, mert nem erre való. Az a baj vele ugyanis, hogy nem fix az elemek sorrendje - a pin kiosztásod viszont igen (bár létezik OrderedDict).

    Én a helyedben megismerkednék a NamedTuple típussal, illetve nem tudom, hogy hányas Python verziót használsz, de a 3.7-es verzió óta támogatott a DataClass is, ami hasonló céllal (is) készült. Ez utóbbi talán valamivel elegánsabb. Mindkettő a standard könyvtár része.

    from collections import namedtuple
    ...
    Ports = namedtuple('Ports', ['Switch1', 'Switch2', 'Switch3', 'Switch4',
    'Button1', 'Button2', 'NC7', 'NC8'])
    ...
    # i2c_io_readed_array: [True, True, True, True, False, True, False, False]
    port_state = Ports(*i2c_io_readed_array)  # figyelj a csillagra!

    Ilyenkor sorrendben rendeli hozzá az értékeket a címkékhez. Ezek után már egyszerűen tudsz hivatkozni a tömbre, vagy egyes elemeire, valahogy így:

    >>> port_state
    Ports(Switch1=True, Switch2=True, Switch3=True, Switch4=True, Button1=False, Button2=True, NC7=False, NC8=False)

    >>> port_state.Switch2
    True

    Ugyanez dataclass-al:

    from dataclasses import dataclass

    @dataclass
    class InputPorts:
        Switch1: bool
        Switch2: bool
        Switch3: bool
        Switch4: bool
        Button1: bool
        Button2: bool
        NC7: bool
        NC8: bool
    ...
    port_state = InputPorts(*i2c_io_readed_array)

    A használata kb. ugyanaz, mint a namedtuple-nek.

    Na most már kezd kicsit sok lenni a szerkesztőben a Warning...
    Ez miért van ?

    A programkódos formázással van valami baja.

  • cog777
    őstag

    Köszi a sok infót. Átrágom majd magam a témán részletesen, de csak holnap (esetleg este).

    Most a legfrissebb Pythont használom. És az biztos hogy most már csak 3-asat szeretnék mindenhol. De azért ami még a 3-ason belül is ennyire új, azt egyelőre nem preferálnám annyira.
    Viszont ezzel kapcsolatosan még egy dologra rákérdeznék:
    Python programozással akarok majd foglalkozni - a PC/Raspberry mellett - nemsokára ESP8266-n illetve ESP32-n is.
    Vagyis ez így már MicroPython lenne.
    Így - ha amúgy nem jelentősebb a hátránya - akkor lehet inkább az olyan adatszerkezeteket, metódusokat részesíteném előnyben, amit fogok tudni majd MicroPython alatt is használni.

    Egyrészt így tanulási szempontból is részben arra fókuszálnék.
    Másrészt most konkrétan ezeket a HW-kezelő függvényeket ha jól megírom, akkor akár tudnám használni a Raspberry Pi helyett/mellett az ESP-ken is majd kapásból.
    Ez tudom hogy kicsit már így OFF lehet itt, de sajnos nem nagyon találtam a PH-n MicroPython-al is foglalkozó topicot. Az Arduino-s topic elég jól pörög, nagyon sok hasznos dolog van, de ott MicroPython-ban valahogy nem nagyon láttam senkit se programozni (amúgy nem is értem miért, a C/C++ -hoz képest azért én elég sok előnyét látom így már kezdetnek is).

    Néztem annó a hivatalos oldalon a különbségeket/limitációkat. De azért az eléggé száraz infónak tűnt. Nem tudsz esetleg valami jó összefoglalót a különbségekről ?
    Vagy akár ajánlásokkal együtt (mi az amit ugyan használhatnánk Micropython/ESP alatt, de nem annyira ajánlott a viszonylag nagyobb memória vagy cpu igénye miatt).

    En hasznalom a Micropythont otthoni projektjeimben.

    Ha jol tudom akkor a Python 3.5-re epul. Van par limitacio az esp8266/32-on. Az elobbi nem tamogajta a szalakat, utobbi nem tud vegtelen mennyisegben szalat kesziteni es eldobni. (Igy timer-t sem erdemes hasznalni) Egy ido utan (kb 1 nap alatt ha percenkent csinalsz szalat es dobsz el pl TCP kapcsolat lekezelesere akkor) nem kepes tobb szalat kesziteni. Valamit nem szabadit fel es betellik a (stack-je) pohara :D
    Erdemes inkabb perzisztens szal(ak)at kesziteni es hozzarendelni egy-egy feladatot.

    En elegedett vagyok a Micropythonnal ezeket a limitaciokat leszamitva. Pycharm-hoz allitolag van plugin is...
    Csinaltam egy homerseklet mero rendszert. Kertben, padlason, nappaliban helyeztem el szenzorokat es egy kijelzon jelenitem meg. Tervben van a webes grafikon megjelenito weblap + sms riasztas ha tul magas homersekletet mer a nappaliban. (Macsek miatt)

    Itt a RPi4/esp32/8266 "fejlesztoi laboromat" latod :D

    " Az Arduino-s topic elég jól pörög, nagyon sok hasznos dolog van, de ott MicroPython-ban valahogy nem nagyon láttam senkit se programozni (amúgy nem is értem miért, a C/C++ -hoz képest azért én elég sok előnyét látom így már kezdetnek is)."
    A kicsi Adruino Uno/Nano-n biztosan nem fut a Micropython, kell neki kb legalabb 80KB memoria.. mas verziokon mar gondolom elindul.

    "Vagy akár ajánlásokkal együtt (mi az amit ugyan használhatnánk Micropython/ESP alatt, de nem annyira ajánlott a viszonylag nagyobb memória vagy cpu igénye miatt)."
    Ez inkabb gyakorlatban jon elo. 8266-on max 20KB szabad memoria van, ami nem tul sok de egyszerubb feladatokra eleg, esp32-on viszont tobb 100 KB vagy meg tobb attol fuggoen hogy PSRAM-ramos verziod van-e. Igy memoria limitacio kevesbe problema.

    A GC-t neha erdemes letiltani ha pontosabb idozitest szeretnel egy-egy feladat kozben, es utana vegrehajtani.

    Ha valami kerdesed van, tedd fel nyugodtan, fel szememet a topicon tartom :)

  • atesss
    addikt

    A mondás szerint akinek kalapácsa van, mindent szögnek néz... :)

    Ebben az esetben én nem használnám a dictionary-t, mert nem erre való. Az a baj vele ugyanis, hogy nem fix az elemek sorrendje - a pin kiosztásod viszont igen (bár létezik OrderedDict).

    Én a helyedben megismerkednék a NamedTuple típussal, illetve nem tudom, hogy hányas Python verziót használsz, de a 3.7-es verzió óta támogatott a DataClass is, ami hasonló céllal (is) készült. Ez utóbbi talán valamivel elegánsabb. Mindkettő a standard könyvtár része.

    from collections import namedtuple
    ...
    Ports = namedtuple('Ports', ['Switch1', 'Switch2', 'Switch3', 'Switch4',
    'Button1', 'Button2', 'NC7', 'NC8'])
    ...
    # i2c_io_readed_array: [True, True, True, True, False, True, False, False]
    port_state = Ports(*i2c_io_readed_array)  # figyelj a csillagra!

    Ilyenkor sorrendben rendeli hozzá az értékeket a címkékhez. Ezek után már egyszerűen tudsz hivatkozni a tömbre, vagy egyes elemeire, valahogy így:

    >>> port_state
    Ports(Switch1=True, Switch2=True, Switch3=True, Switch4=True, Button1=False, Button2=True, NC7=False, NC8=False)

    >>> port_state.Switch2
    True

    Ugyanez dataclass-al:

    from dataclasses import dataclass

    @dataclass
    class InputPorts:
        Switch1: bool
        Switch2: bool
        Switch3: bool
        Switch4: bool
        Button1: bool
        Button2: bool
        NC7: bool
        NC8: bool
    ...
    port_state = InputPorts(*i2c_io_readed_array)

    A használata kb. ugyanaz, mint a namedtuple-nek.

    Köszi a sok infót. Átrágom majd magam a témán részletesen, de csak holnap (esetleg este).

    Most a legfrissebb Pythont használom. És az biztos hogy most már csak 3-asat szeretnék mindenhol. De azért ami még a 3-ason belül is ennyire új, azt egyelőre nem preferálnám annyira.
    Viszont ezzel kapcsolatosan még egy dologra rákérdeznék:
    Python programozással akarok majd foglalkozni - a PC/Raspberry mellett - nemsokára ESP8266-n illetve ESP32-n is.
    Vagyis ez így már MicroPython lenne.
    Így - ha amúgy nem jelentősebb a hátránya - akkor lehet inkább az olyan adatszerkezeteket, metódusokat részesíteném előnyben, amit fogok tudni majd MicroPython alatt is használni.

    Egyrészt így tanulási szempontból is részben arra fókuszálnék.
    Másrészt most konkrétan ezeket a HW-kezelő függvényeket ha jól megírom, akkor akár tudnám használni a Raspberry Pi helyett/mellett az ESP-ken is majd kapásból.
    Ez tudom hogy kicsit már így OFF lehet itt, de sajnos nem nagyon találtam a PH-n MicroPython-al is foglalkozó topicot. Az Arduino-s topic elég jól pörög, nagyon sok hasznos dolog van, de ott MicroPython-ban valahogy nem nagyon láttam senkit se programozni (amúgy nem is értem miért, a C/C++ -hoz képest azért én elég sok előnyét látom így már kezdetnek is).

    Néztem annó a hivatalos oldalon a különbségeket/limitációkat. De azért az eléggé száraz infónak tűnt. Nem tudsz esetleg valami jó összefoglalót a különbségekről ?
    Vagy akár ajánlásokkal együtt (mi az amit ugyan használhatnánk Micropython/ESP alatt, de nem annyira ajánlott a viszonylag nagyobb memória vagy cpu igénye miatt).

  • cousin333
    addikt

    Felbuzdulva azon, hogy - Silεncε segítségével - tök jól működik ez az előző, dictionary-s megoldás, gondoltam hogy egy következő feladatban is ezt használnám adatszerkezetnek.
    Adott egy szintén HW-kezelő library (PCF8574 I2C-s I/O modul), ami egy port 8 pinjének állapotát egy array-ben adja vissza (i2c_io_readed_array = pcf.port).
    Ezen még kicsit dolgozok (megfordítom a tömböt, és negálom az elemeket), de végeredményben egy ugyanolyan, 8 elemű, boolean tagokból álló tömböt kapok (pl. [True, True, True, True, False, True, False, False] ).
    Arra, hogy fizikailag melyik pin-re mi van kötve, - az előző feladathoz hasonló okokból - most is csináltam - az ezt kezelő függvényen belül - egy "táblázatot" egy dictionary-vel:
        i2c_io_port_dictionary = {
            1: 'Switch1',
            2: 'Switch2',
            3: 'Switch3',
            4: 'Switch4',
            5: 'Button1',
            6: 'Button2',
            7: '[Not-Connected7]',
            8: '[Not-Connected8]'
        }

    És az aktuális értékek pedig:
    i2c_io_readed_array_reversed [True, True, True, True, False, True, False, False]
    Hogyan tudnák ebből a kettőből valami ilyesmi formátumot csinálni ?
        i2c_io_readedvalue_dictionary = {
            'Switch1' : 'True',
            'Switch2' : 'True',
            'Switch3' : 'True',
            'Switch4' : 'True',
            'Button1' : 'False',
            'Button2' : 'True',
            '[Not-Connected7]' : 'False',
            '[Not-Connected8]' : 'False',
      }
    Egy olyat találtam csak eddig, amivel az eredeti dictionary-hez képest
    meg tudom fordítani a kulcsokat és az értékeket:
        i2c_io_inverted_dictionary = dict()
        for key, value in i2c_io_port_dictionary.items():
            i2c_io_inverted_dictionary.setdefault(value, list()).append(key)
    De aztán elakadtam, mert nem tudom hogyan tudnám átcserélni az értékeket a tömbben lévőkre.

    A mondás szerint akinek kalapácsa van, mindent szögnek néz... :)

    Ebben az esetben én nem használnám a dictionary-t, mert nem erre való. Az a baj vele ugyanis, hogy nem fix az elemek sorrendje - a pin kiosztásod viszont igen (bár létezik OrderedDict).

    Én a helyedben megismerkednék a NamedTuple típussal, illetve nem tudom, hogy hányas Python verziót használsz, de a 3.7-es verzió óta támogatott a DataClass is, ami hasonló céllal (is) készült. Ez utóbbi talán valamivel elegánsabb. Mindkettő a standard könyvtár része.

    from collections import namedtuple
    ...
    Ports = namedtuple('Ports', ['Switch1', 'Switch2', 'Switch3', 'Switch4',
    'Button1', 'Button2', 'NC7', 'NC8'])
    ...
    # i2c_io_readed_array: [True, True, True, True, False, True, False, False]
    port_state = Ports(*i2c_io_readed_array)  # figyelj a csillagra!

    Ilyenkor sorrendben rendeli hozzá az értékeket a címkékhez. Ezek után már egyszerűen tudsz hivatkozni a tömbre, vagy egyes elemeire, valahogy így:

    >>> port_state
    Ports(Switch1=True, Switch2=True, Switch3=True, Switch4=True, Button1=False, Button2=True, NC7=False, NC8=False)

    >>> port_state.Switch2
    True

    Ugyanez dataclass-al:

    from dataclasses import dataclass

    @dataclass
    class InputPorts:
        Switch1: bool
        Switch2: bool
        Switch3: bool
        Switch4: bool
        Button1: bool
        Button2: bool
        NC7: bool
        NC8: bool
    ...
    port_state = InputPorts(*i2c_io_readed_array)

    A használata kb. ugyanaz, mint a namedtuple-nek.

  • cousin333
    addikt

    Hát még csak nemrég kezdtem tanulni a Pythont, szóval a dictionary-t még nem ismertem.
    De utánanéztem, köszi, nem tűnik rossznak, megoldhatja a problémát.
    Viszont csak du. tudom majd kipróbálni (ha a - már a végleges helyére beépített - hardver előtt leszek).
    (Lehetne szimulálni, hogy a HW-lekérdező rutinba beírni egy fix érték-behelyettesítést, ha IOError van, de egyelőre nem csináltam meg. Tekintve hogy vannak további, közvetlen GPIO műveletek is a teljes programban, azoknak a függvényeit meg szintén csak részlegesen tudnám tesztelni a hardver nélkül, nem biztos hogy van értelme.)

    Viszont amit te írtál formula, az így nem tűnik a teljesnek. Azok alapján amit neten találtam, én kb. egy ilyen teljes kódot képzelnék el:
    def adc_measure(channel_name):
        channel_dictionary = {
            'A0': 0x40,
            'A1': 0x41,
            'A2': 0x42,
            'A3': 0x43
        }
        ...
        bus.write_byte(I2C_address, channel_dictionary.get(channel_name))
    És akkor ezen a HW-kezelő függvényen kívül semmi más nem kell, csak a main-ben a meghívás az eddigiek szerint:
    ADCCh0_sum_1s = ADCCh0_sum_1s + adc_measure("A0")
    Vagy ide akkor így nem is kellene az idézőjel az A0-hoz ? (amúgy az lenne a tényleg szép megoldás, ha nem kellene).

    A beírt formula helyes, egyszerűen kihagyta az értékadás részt (channel dictionary =), gondolván, hogy nem kell máshol ez az info.

    Gondolom már rájöttél, hogy kell az idézőjel. Én még talán kiegészíteném egy vizsgálattal és az egész olvasós részt betenném alá, valahogy így:

    def adc_measure(channel_name):
        channel_dictionary = {
            'A0': 0x40,
            'A1': 0x41,
            'A2': 0x42,
            'A3': 0x43,
        }

        if channel_name in channel_dictionary:
            ...
            bus.write_byte(I2C_address, channel_dictionary.get(channel_name))

  • atesss
    addikt

    Felbuzdulva azon, hogy - Silεncε segítségével - tök jól működik ez az előző, dictionary-s megoldás, gondoltam hogy egy következő feladatban is ezt használnám adatszerkezetnek.
    Adott egy szintén HW-kezelő library (PCF8574 I2C-s I/O modul), ami egy port 8 pinjének állapotát egy array-ben adja vissza (i2c_io_readed_array = pcf.port).
    Ezen még kicsit dolgozok (megfordítom a tömböt, és negálom az elemeket), de végeredményben egy ugyanolyan, 8 elemű, boolean tagokból álló tömböt kapok (pl. [True, True, True, True, False, True, False, False] ).
    Arra, hogy fizikailag melyik pin-re mi van kötve, - az előző feladathoz hasonló okokból - most is csináltam - az ezt kezelő függvényen belül - egy "táblázatot" egy dictionary-vel:
        i2c_io_port_dictionary = {
            1: 'Switch1',
            2: 'Switch2',
            3: 'Switch3',
            4: 'Switch4',
            5: 'Button1',
            6: 'Button2',
            7: '[Not-Connected7]',
            8: '[Not-Connected8]'
        }

    És az aktuális értékek pedig:
    i2c_io_readed_array_reversed [True, True, True, True, False, True, False, False]
    Hogyan tudnák ebből a kettőből valami ilyesmi formátumot csinálni ?
        i2c_io_readedvalue_dictionary = {
            'Switch1' : 'True',
            'Switch2' : 'True',
            'Switch3' : 'True',
            'Switch4' : 'True',
            'Button1' : 'False',
            'Button2' : 'True',
            '[Not-Connected7]' : 'False',
            '[Not-Connected8]' : 'False',
      }
    Egy olyat találtam csak eddig, amivel az eredeti dictionary-hez képest
    meg tudom fordítani a kulcsokat és az értékeket:
        i2c_io_inverted_dictionary = dict()
        for key, value in i2c_io_port_dictionary.items():
            i2c_io_inverted_dictionary.setdefault(value, list()).append(key)
    De aztán elakadtam, mert nem tudom hogyan tudnám átcserélni az értékeket a tömbben lévőkre.

  • atesss
    addikt

    Dupla...
    Egy warning-ot írt ki amikor be akartam küldeni a hsz-t, de aztán a programkód formázások helyén kicsit szerkesztve már elfogadta. Na de az meg nem mondta, hogy mégis elsőre is már elküldte...

  • atesss
    addikt

    {
    'A0': 0x40,
    'A1': 0x41,
    'A2': 0x42,
    'A3': 0x43
    }.get(channel_name)

    Sok magyarázatra szerintem nem szorul, egy dictionary-t csinálsz belőle és abból tudsz get-elni (ha meg nem valid értéket kap, a get None-al fog visszatérni

    Hát még csak nemrég kezdtem tanulni a Pythont, szóval a dictionary-t még nem ismertem.
    De utánanéztem, köszi, nem tűnik rossznak, megoldhatja a problémát.
    Viszont csak du. tudom majd kipróbálni (ha a - már a végleges helyére beépített - hardver előtt leszek).
    (Lehetne szimulálni, hogy a HW-lekérdező rutinba beírni egy fix érték-behelyettesítést, ha IOError van, de egyelőre nem csináltam meg. Tekintve hogy vannak további, közvetlen GPIO műveletek is a teljes programban, azoknak a függvényeit meg szintén csak részlegesen tudnám tesztelni a hardver nélkül, nem biztos hogy van értelme.)

    Viszont amit te írtál formula, az így nem tűnik a teljesnek. Azok alapján amit neten találtam, én kb. egy ilyen teljes kódot képzelnék el:
    def adc_measure(channel_name):
        channel_dictionary = {
            'A0': 0x40,
            'A1': 0x41,
            'A2': 0x42,
            'A3': 0x43
        }
        ...
        bus.write_byte(I2C_address, channel_dictionary.get(channel_name))
    És akkor ezen a HW-kezelő függvényen kívül semmi más nem kell, csak a main-ben a meghívás az eddigiek szerint:
    ADCCh0_sum_1s = ADCCh0_sum_1s + adc_measure("A0")
    Vagy ide akkor így nem is kellene az idézőjel az A0-hoz ? (amúgy az lenne a tényleg szép megoldás, ha nem kellene).

  • Silεncε
    őstag

    Üdv !
    Raspberry Pi-n használok egy AD átalakítót, és az eddig Píthon kódomat most megpróbáltam kicsit úgy átalakítani - a jobb átláthatóság érdekében - hogy minden változó csak a szükséges függvényben legyen érvényes.
    Illetve a hardverhez kapcsoló adat (jelen esetben pl. a csatornáknak a címe) is csak az adott hardver-kezelő függvényben legyen megadva.
    Viszont így eléggé "körülményes" lett a kód végére:
    Main függvény releváns részei:
    I2C_address = 0x48
    ADCCh0_sum_1s = ADCCh0_sum_1s + adc_measure("A0")
    ADCCh1_sum_1s = ADCCh1_sum_1s + adc_measure("A1")
    ADCCh2_sum_1s = ADCCh2_sum_1s + adc_measure("A2")
    ADCCh3_sum_1s = ADCCh3_sum_1s + adc_measure("A3")
    És a két releváns függvényem:
    def adc_measure(channel_name):
      global I2C_address
        channel = get_channel_from_name(channel_name)
        try: 
          bus.write_byte(I2C_address,channel)
        except IOError: 
            pass
        try: 
          adc_dummyread = bus.read_byte(I2C_address)
        except IOError: 
            pass
        time.sleep(0.001)
        try: 
          adc_value = bus.read_byte(I2C_address)
        except IOError: 
            pass
        # print("ADC readed value on Channel Name",channel_name, "(Hexa-ID: ", hex(channel),"): ",adc_value)
        # print('------')
        time.sleep(0.001)
        return adc_value
       
    def get_channel_from_name(channel_name):
        A0 = 0x40
        A1 = 0x41
        A2 = 0x42
        A3 = 0x43
        if channel_name == "A0":
            channel = A0
        if channel_name == "A1":
            channel = A1
        if channel_name == "A2":
            channel = A2
        if channel_name == "A3":
            channel = A3
        # print("Non-converted channel name:  ",channel)
      return channel
    A kikommentezett print-eket csak debug célra használtam.

    A "névkonvertáló" függvényt hogyan tudnám elhagyni ?
    (Ha viszont direkt feltétel, hogy nem akarom a main-ben megadni az A0, A1, A2, A3 -at.)
    Mert én hiába kerestem, nem találtam olyan függvényt, amivel ezt a funkciót egyszerűbben végre tudnám hajtani. Hogyan lehetne kiváltani az " = A0" ... " = A3" értékadó sorokat ?

    {
    'A0': 0x40,
    'A1': 0x41,
    'A2': 0x42,
    'A3': 0x43
    }.get(channel_name)

    Sok magyarázatra szerintem nem szorul, egy dictionary-t csinálsz belőle és abból tudsz get-elni (ha meg nem valid értéket kap, a get None-al fog visszatérni

  • atesss
    addikt

    Üdv !
    Raspberry Pi-n használok egy AD átalakítót, és az eddig Píthon kódomat most megpróbáltam kicsit úgy átalakítani - a jobb átláthatóság érdekében - hogy minden változó csak a szükséges függvényben legyen érvényes.
    Illetve a hardverhez kapcsoló adat (jelen esetben pl. a csatornáknak a címe) is csak az adott hardver-kezelő függvényben legyen megadva.
    Viszont így eléggé "körülményes" lett a kód végére:
    Main függvény releváns részei:
    I2C_address = 0x48
    ADCCh0_sum_1s = ADCCh0_sum_1s + adc_measure("A0")
    ADCCh1_sum_1s = ADCCh1_sum_1s + adc_measure("A1")
    ADCCh2_sum_1s = ADCCh2_sum_1s + adc_measure("A2")
    ADCCh3_sum_1s = ADCCh3_sum_1s + adc_measure("A3")
    És a két releváns függvényem:
    def adc_measure(channel_name):
      global I2C_address
        channel = get_channel_from_name(channel_name)
        try: 
          bus.write_byte(I2C_address,channel)
        except IOError: 
            pass
        try: 
          adc_dummyread = bus.read_byte(I2C_address)
        except IOError: 
            pass
        time.sleep(0.001)
        try: 
          adc_value = bus.read_byte(I2C_address)
        except IOError: 
            pass
        # print("ADC readed value on Channel Name",channel_name, "(Hexa-ID: ", hex(channel),"): ",adc_value)
        # print('------')
        time.sleep(0.001)
        return adc_value
       
    def get_channel_from_name(channel_name):
        A0 = 0x40
        A1 = 0x41
        A2 = 0x42
        A3 = 0x43
        if channel_name == "A0":
            channel = A0
        if channel_name == "A1":
            channel = A1
        if channel_name == "A2":
            channel = A2
        if channel_name == "A3":
            channel = A3
        # print("Non-converted channel name:  ",channel)
      return channel
    A kikommentezett print-eket csak debug célra használtam.

    A "névkonvertáló" függvényt hogyan tudnám elhagyni ?
    (Ha viszont direkt feltétel, hogy nem akarom a main-ben megadni az A0, A1, A2, A3 -at.)
    Mert én hiába kerestem, nem találtam olyan függvényt, amivel ezt a funkciót egyszerűbben végre tudnám hajtani. Hogyan lehetne kiváltani az " = A0" ... " = A3" értékadó sorokat ?

  • axioma
    veterán
    A megválaszolt hozzászólás már nem elérhető.

    Oh, akkor egyreszt bocs hogy belevau masreszt koszi, en is tanultam valamit.

  • axioma
    veterán
    A megválaszolt hozzászólás már nem elérhető.

    Neked nem a belso file-ok datuma kell? Normalisan letrehozott zip-nel az szamit nem hogy mikor lett csomagolva. Vagy ez eleve csunyan lett csinalva, programmal de nem kitoltve? En java-ban kuzdottem 1x egy kiszamithatatlanul kitoltott valtozattal...

  • sh4d0w
    félisten

    van egy scriptem ami egy fájlt ír a végén, soronként, de rengeteg sor az egész, így ez a része elég lassú. azt meg lehet valahogy csinálni, hogy legenerálom, mi kerüljön a fájlba, és egybe iratom ki?

    Persze, hozzáadod egy listához és azt a végén egyben írod ki.

  • concret_hp
    addikt

    van egy scriptem ami egy fájlt ír a végén, soronként, de rengeteg sor az egész, így ez a része elég lassú. azt meg lehet valahogy csinálni, hogy legenerálom, mi kerüljön a fájlba, és egybe iratom ki?

  • Siriusb
    veterán

    talán os.systemmel su-zva. elé egy echo password pipe, és beírja a jelszót, amikor promptként kéri. pl.:
    os.system("echo <otherpwd> | su - otheruser -c 'parancs'")
    sajnos most nem tudom kipróbálni, hogy megmarad-e a shell ilyenkor a következő parancsra.

    tbh, én ezt nem így használnám POC-on kívül, mert rossz gyakorlat hardkódolni bármilyen jelszót, szóval a jelszó bekérésére találj ki valami secure megoldást, pl. getpass(), vagy érd el, hogy sudozni lehessen jelszó nélkül a szóban forgó parancsot.

    Köszi! Jelszó nem érdekes, mert egyrészt saját gépen megy, másrészt csak egy korlátozott ftp felhasználó.
    Még molyolok rajta, ha lesz rá érkezésem.

  • velizare
    nagyúr

    Linux-on szeretném az os.utime()-mal megváltoztatni a megváltoztatandókat. Mivel az adott fájlt-nak a tulajdonosa nem egyezik meg azzal, aki a script-et futtatja, ez a parancs nem fog működni.
    Nem találok rá egyszerű megoldást. Mi a módi? subprocess + touch?
    Az os.setuid ugye kevés, kellene a jelszó, hitelesítés.

    talán os.systemmel su-zva. elé egy echo password pipe, és beírja a jelszót, amikor promptként kéri. pl.:
    os.system("echo <otherpwd> | su - otheruser -c 'parancs'")
    sajnos most nem tudom kipróbálni, hogy megmarad-e a shell ilyenkor a következő parancsra.

    tbh, én ezt nem így használnám POC-on kívül, mert rossz gyakorlat hardkódolni bármilyen jelszót, szóval a jelszó bekérésére találj ki valami secure megoldást, pl. getpass(), vagy érd el, hogy sudozni lehessen jelszó nélkül a szóban forgó parancsot.

  • Siriusb
    veterán

    Linux-on szeretném az os.utime()-mal megváltoztatni a megváltoztatandókat. Mivel az adott fájlt-nak a tulajdonosa nem egyezik meg azzal, aki a script-et futtatja, ez a parancs nem fog működni.
    Nem találok rá egyszerű megoldást. Mi a módi? subprocess + touch?
    Az os.setuid ugye kevés, kellene a jelszó, hitelesítés.

  • sh4d0w
    félisten

    Amint irtam terminálból fut már python.fájlnév.py parancsal. De ahogy irtam is az a baj h csak így fut. Tehát enteres futattás fájlkezelőből ás Geanys futtattás kilőve.
    Akkor hogy tud futni terminálból miután aktiválom az ecmwf et?
    Nem értem. :(
    Ha nem lesz megoldás akkor irok annak a Franciának aki a cikket írta, bár írtam már délelőtt, arra sem válaszolt még.
    Amúgy még aztán külön Python kiterjesztés is feltelepittem mielőtt nem jöttem rá hogy működik a terminálból.

    Az ecmwf egy virtuális környezet, amiben benne van a magics modul, de csak akkor érhető el, ha aktiválod.

  • olivera88
    veterán

    A két hiba ugyanazt mondja: nincs magicsed.

    Amint irtam terminálból fut már python.fájlnév.py parancsal. De ahogy irtam is az a baj h csak így fut. Tehát enteres futattás fájlkezelőből ás Geanys futtattás kilőve.
    Akkor hogy tud futni terminálból miután aktiválom az ecmwf et?
    Nem értem. :(
    Ha nem lesz megoldás akkor irok annak a Franciának aki a cikket írta, bár írtam már délelőtt, arra sem válaszolt még.
    Amúgy még aztán külön Python kiterjesztés is feltelepittem mielőtt nem jöttem rá hogy működik a terminálból.

  • sh4d0w
    félisten

    Telepitettem az Anacondat, és onnan egy meteorológiai programot ami python felülettel működik.
    A gond csak az h terminálból tudom futattni a python scripteket. Előtte megvolt a Debian tároloban lévő változat, annál persze nem volt ilyen gond.
    A program akkor indul ha aktiválom az ECMWF et a terminálból, az anaconda activate ecmwf parancsal. A program oldalán viszont ezt nem írta, ők csak ennyit irtak.
    Please make sure to activate you conda environment before running your python program
    A conda activate parancsal.

    Ha nem aktiválom anacondával az ecmwf et akkor egyáltalán nem tudok scriptet futtatni, sehogy, se terminálból, se magát python fájlt enterrel fájl kezelőböl, se Geany szöv szerkesztőböl.
    Ha aktiválom az ecmwf akkor már működik a program, de csak terminálból hajlandó, a python fájlnev.py parancsal, enteres futattás fájlkezelőböl és a Geanys futás továbbra se megy, ami problémám mert így jó lassan tudok haladni.

    Ha Geanybol probálom futtatni azt írja hiánzik egy modul.

    Traceback (most recent call last):
    File "arpegepcpvhuconv_72.py", line 4, in <module>
    from Magics.macro import *
    ImportError: No module named Magics.macro

    Ha meg nem aktiválom ecmwf-t anacondával akkor meg ilyen hibát dob.

    Ezekszerint mindenképpen szükséges az aktiválás :F , csak az baj amit az előbb is irtam h csak terminálból tudok futattni lassú modszerrel.

    A két hiba ugyanazt mondja: nincs magicsed.

  • olivera88
    veterán

    Telepitettem az Anacondat, és onnan egy meteorológiai programot ami python felülettel működik.
    A gond csak az h terminálból tudom futattni a python scripteket. Előtte megvolt a Debian tároloban lévő változat, annál persze nem volt ilyen gond.
    A program akkor indul ha aktiválom az ECMWF et a terminálból, az anaconda activate ecmwf parancsal. A program oldalán viszont ezt nem írta, ők csak ennyit irtak.
    Please make sure to activate you conda environment before running your python program
    A conda activate parancsal.

    Ha nem aktiválom anacondával az ecmwf et akkor egyáltalán nem tudok scriptet futtatni, sehogy, se terminálból, se magát python fájlt enterrel fájl kezelőböl, se Geany szöv szerkesztőböl.
    Ha aktiválom az ecmwf akkor már működik a program, de csak terminálból hajlandó, a python fájlnev.py parancsal, enteres futattás fájlkezelőböl és a Geanys futás továbbra se megy, ami problémám mert így jó lassan tudok haladni.

    Ha Geanybol probálom futtatni azt írja hiánzik egy modul.

    Traceback (most recent call last):
    File "arpegepcpvhuconv_72.py", line 4, in <module>
    from Magics.macro import *
    ImportError: No module named Magics.macro

    Ha meg nem aktiválom ecmwf-t anacondával akkor meg ilyen hibát dob.

    Ezekszerint mindenképpen szükséges az aktiválás :F , csak az baj amit az előbb is irtam h csak terminálból tudok futattni lassú modszerrel.

  • Sziawztok!
    Az 1.3" OLED probléma megoldva.
    #!/usr/bin/env python
    # "Hello World" for display sh1106 in Raspberry Pi
    # 2018 https://ph0en1x.net
    from device import sh1106
    from render import canvas
    from PIL import ImageFont
    from time import sleep
    device = sh1106(port=1, address=0x3C, width=132, height=64) # for RPi rev 2 port(smbus) = 1
    font = ImageFont.load_default()
    with canvas(device) as draw:
        draw.text((10, 0), "* Üdv mindazoknak *", font=font, fill=255)
        draw.text((10, 15),"akik esetleg eddig", font=font, fill=255)
        draw.text((5, 30), "nem tudták használni", font=font, fill=255)
        draw.text((10, 45), "az 1.3-as OLED-et.", font=font, fill=255)
    sleep(5)               # Wait 3 seconds.-et.
    device.command(0xAE)   # Display OFF.
    sleep(1)               # Wait 1 second.
    device.command(0xAF)   # Display ON.

  • asuspc96
    őstag

    A leírását elnézve olyan sok probléma nem lehet vele. A potméterek jól vannak beállítva? Az egyik az érzékenységet állítja (ez lehet túl érzékeny is, mindenre bekapcsol), a másik a bekapcsolás időtartamát, ami a leírás szerint akár 200 mp is lehet, ami nem kevés. A legrosszabb eset persze a kettő (rossz) kombinációja.

    Rá tudsz mérni valamivel (oszcilloszkóp, multiméter, digitális analizátor)?

    Valószínűleg azokkal volt a baj valóban, azóta már átszenvedtem magam a problematikán :R

Új hozzászólás Aktív témák