Új hozzászólás Aktív témák
-
cousin333
addikt
válasz
asuspc96
#2798
üzenetére
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)?
-
Janos46
tag
Sziasztok.
Ha valaki jártas az OLED 1306-os témában, talán tud segíteni.
Vettem még otthon egy 1.3" és egy 0.96"-os kijelzőt. A 0.96-ost használtam, és az úgy működött ahogy kell. Mikor a nagyobbat beraktam a helyére fura dolgot láttam, amint láthattok is a képen. Gondoltam annak annyi és mivel itt majd fele áron lehetett venni, vettem egy másikat. Sajnos a jelenség ugyan az. Az kizárt, hogy ugyan az a hibája legyen mind a kettőnek. Az üzletben azt mondták működik, tehát nincs csere. Tudnátok segíteni?
Időközben némi új infó is lett:
Cikk: https://bitekmindenhol.blog.hu/2018/06/04/ssd1306_oled_kijelzo#comments
Az 1,3"-os lehet SSD1306 vagy SH1106 chip-el szerelt, a kisebbek csak SSD1306-osak lehetnek.
SH1106 https://www.elecrow.com/download/SH1106%20datasheet.pdf
Support maximum 132 X 64 dot matrix panel
Embedded 132 X 64 bits SRAM
Operating voltage:
- Logic voltage supply: VDD1 = 1.65V - 3.5V
- DC-DC voltage supply: VDD2 = 3.0V – 4.2V
SSD1306 https://cdn-shop.adafruit.com/datasheets/SSD1306.pdf
• Resolution: 128 x 64 dot matrix panel
• Power supply
o VDD = 1.65V to 3.3V for IC logic
o VCC = 7V to 15V for Panel driving
Nem igazán értek hozzá. Akkor most 4 sor kimarad? Mert ha a 132 sorba akar 128 sort betenni, akkor bizony van elcsúszás. Ha a géphez jutok, megnézem hogy a .h fájlban van-e erre vonatkozó paraméterezés.
Vélemény?
Ps.
Ha valaki python alatt bíbelődik a 1306-al, akkor ajánlom az alábbi cikket:
https://ph0en1x.net/96-oled-display-ssd1306-raspberry-pi-connection-experimets.html -
asuspc96
senior tag
Helló,
Beszúrom ide is a kérdésem, hátha itt jobban járok vele: https://prohardver.hu/tema/raspberry_pi/hsz_38185-38185.html
-
cousin333
addikt
delimiter == sep
Ezek szerint viszont megvan a probléma oka. Arra figyelni kell, hogy általában az interaktív prompt sem ír ki mindent, csak az utolsó elemet (hacsak nem használsz print-et).
Pandas-ról lehet nézni pár újabb YT videót, de szerintem a hivatalos dokumentációt érdemes böngészni. Ahogy látom, külsőre megváltozott, de tartalmilag eddig is rendben volt. A "mit, hogyan" típusú kérdésekhez a User Guide az érdekes, a piszkos részletekhez meg a referencia.
Ha gyárilag, Pythonnal készítesz csv-t, akkor az UTF-8-at használ, és nem kell semmi konverzió. Ha Excel kompatibilis, akkor cp-1250, elsősorban az ékezetek miatt. Itt tipikus beolvasási paraméter-igény szokott még lenni a sep=";" és a decimal=",", hogy a tizedes értékek is kiértékelhetők legyenek. Esetleg érdemes lehet megadni az egyes oszlopok adattípusait, valamint az index oszlop sorszámát (ha van). A dátum típusokra vannak külön függvények is, akár két oszlopból (dátum + idő) is lehet egyetlen datetime oszlopot összeállítani.
-
axioma
veterán
Igazabol a python console (most mind1 hogy Jupyter notebook vagy Idle amivel a kozepsulisokat tanitjak mert a python installer resze, vagy akar a pycharm-ban is van python console) az egy interaktiv eszkoz, es az ha kifejezest (jobberteket) kap egy parancssorban, akkor annak az erteket kiirja (raadasul idonkent intelligensebben, mint a python print-je). De ez nem a python hanem az interaktiv konzol tulajdonsaga. Ha programot irsz, akkor - mint mas programnyelveken is - az a sor ami jobberteket tartalmaz, az a kifejezes vegrehajtodik, de ha nincs a keletkezo ertek eltarolva, akkor siman eldobasra kerul. Ahogy peldaul a nyelvek tobbsegeben lehet fuggvenyt eljaraskent hivni (nem csinalni semmit az eredmenyevel). De semmikepp nem kerul kiirasra.
Ha programot irsz pycharm-mal, akkor van amugy me'g egy lehetoseged: teszel egy breakpoint-ot az adott valtozo ertekadasa utani utasitasra, es megnezed, hogy a valtozo mit tartalmaz a Debugger ablakban [a console mellett lesz lathato, amikor elinditod a debug-ot]. Neked az a lenyeg hogy a valtozoba belekerult-e az ertek, es mivel az strukturaltan mutatja (pl. list-et indexszel), jobban is latod mintha egy print erteket kene nezned es szamolgatni, mi hanyadik. -
Louro
őstag
Elnézést a spamért, de hasznos lehet egyeseknek.
A netes tutorial-okban azért használnak Jupyter-t, mert az egy web alapú felület. A PyCharm pedig nem Python shell, ami mindent kiír automatikusan. Emiatt, ami Jupyter-ben kiír valamit, azt a PyCharm-ban ki kell "printelni".
-
Louro
őstag
Már nem tudtam szerkeszteni.
Amiket néztem YT videókat, ott a Jupyter-t használták. Ott a lenti alapján a dataset_1-re a beolvasott állományt kellene kiírnia. A dataset.head(3)-ra pedig az első 3 sort.
Most annyit módosítottam, hogy print függvénybe tettem és megoldódott.
A régi, nem működő (PyCharm alatt):
import pandas as pd
dataset_1 = pd.read_csv('teszt.csv', sep = ';')
dataset_1.head(3)Az új, működő (PyCharm alatt)
import pandas as pd
dataset_1 = pd.read_csv('teszt.csv', sep = ';')
print(dataset_1.head(3))Valóban ennyit számítana a környezet is? :/
-
Louro
őstag
Sziasztok!
Lehet ciki, de egy napom ráment szinte.
Adott a legújabb PyCharm (2020.1.2). Pandas telepítve.
A kód elég egyszerű:
import pandas as pddataset_1 = read_csv('teszt.csv', sep=';')dataset_1A teszt.csv tartalma igazából 4 sor.
Tartalma:
H1;H2;H3;H4
afgssdgsdv;dfsdf;77212;2020.01.23
afgssdgsdv;sdfsgfsb;25855;2017.12.03
afgssdgsdv;sfb;47983;2019.08.24Már gugliztam annyit, de nem tudom miért nem megy. Ha nem UTF8 a forrás, akkor kb. agyhalál. encoding='cp1250' beírva lefut hiba nélkül, de nem jön létre semmi.
Ha átállítom UTF8-ra, akkor lefut a fenti, de üres a dataset_1 . dataset_1.head(3)-ra se dob semmit.Nem gondoltam volna, hogy így megfog egy egyszerű feladat.
-
cog777
őstag
-
Mr Dini
addikt
Egyébként ilyen esetekben ha egy keepalive gondolom poller task futna a háttérben, de a kód többi része nem vészesen heavy, akkor melyiket célszerűbb meglépni? Külön szál mindenképp, vagy asyncio és a blocking metódusokat executorral hívni?
Ugye szálat nyitni erőforrás, míg az asyncio single-threaded, csak az executor híváshoz használna szálakat.
Így is úgyis ott a GIL block, soha nem lesznek a Python szálak párhuzamosan futtatva, de érdekel, hogy mikor melyiket célszerű használni.
Sok helyen azt hallottam, hogy asyncio-t akkor, ha IO orientált az app, pl REST API stb, szálakat meg CPU megerőltető folyamatoknál kell használni. De az utóbbit nem értem, ha én kiadok egy 9999999999 ** 9999999999-et, az elég CPU megerőltető, a GIL block miatt ugyanott vagyok, szálakkal se érek semmit.
-
Azért "fagy le", mert a KeepAlive függvény nem tér vissza, így a threading.Thread várhat az örökkévalóságig, hogy megkapja a callable object-et. máshol meg azért fut hibára, mert a meghívott függvény nem callable object-tel tér vissza (mert van olyan helyzet, ahol egy szelektor függvénnyel választod ki, hogy melyik függvény referenciáját add vissza - pl os-specifikus függvények esetében).
-
kovisoft
őstag
Így van, jól mondja asuspc96, a target argumentumban egy függvény (callable object) referenciát kell megadni (azaz szimplán a függvény nevét kell beírni), és majd a rendszer fogja azt meghívni, amikor elindítod a threadet. Ha viszont odaírod a "()"-t is, akkor te magad hívod meg a függvényt, ami jelen esetben ráadásul olyan, hogy soha nem tér vissza, ezért el sem jut odáig a vezérlés, hogy létrejöjjön a thread. Próbáld így:
keephopealive = threading.Thread(target=self.goproCamera.KeepAlive, args=()) -
togvau
senior tag
hogy lehet ebben a pitonban egy metódust, vagy eljárást, vagy aminek itt nevezik, a háttérben futtatni?
Tehát amikor elindul az app, init-ben meghívom, és fut a háttérbe amíg az egész alkalmazást bezárom, DE meghívás után az init többi része megy tovább.De nem megy. Ha threadként létrehozom, blokkolja az egész alkalmazást, vár amíg vége (soha).
keephopealive = threading.Thread(target=self.goproCamera.KeepAlive(), args=())
keephopealive.daemon = True
keephopealive.start() -
kovisoft
őstag
válasz
asuspc96
#2776
üzenetére
Rendben, akkor én értettem félre. Ha meg kell várniuk egymást és egyszerre kell újraindulniuk, akkor jó lesz cog777 join-os megoldása.
Pythonban nem lesz memóriaszivárgás, mert automatikusan felszabadítja azokat az objektumokat, amikre már nincs referencia.
Szerk: lassú voltam.
-
cog777
őstag
válasz
kovisoft
#2775
üzenetére
Az nem baj ha elcsusznak a szalak egymashoz kepest? Latom eselyet annak hogy valamelyik hamarabban vegez mint a masik, tehat nem lesznek szinkronban.
Szerk: ja, latom hogy fontos az egyszerre indulas.
Akkor en a flag-es megoldast valasztanam vagy a joinolost
@asuspc96: pythonban van automata GC, nem lesz szivargas.
-
asuspc96
senior tag
"En meg a harverhez ertek kevesbe, mennyi a relek kapcsolasi ideje?"
Konkrét kapcsolási időt nem tudok, de gondolom elég gyors, mert kattog mint az állat
Ezt vettem:
[4 csatornás optocsatolós relémodul Raspberry PI-hez]@kovisoft
"Így meg ha eltérő futásideje van az egyes threadeknek, akkor mindegyik meg fogja várni a leglassabbat, és csak azután fognak újraindulni."
Az egyáltalán nem gond, ez lenne a cél, h mindegyik megcsinálja a maga kis melóját, majd ha az összes végzett, és megkapták a vezérlő jelet, akkor újra kezdhetik
Fontos, hogy egyszerre kezdjék újra
Szóval ez a joinolós, meg listakitörlős megoldás nekem tetszik amit javasoltál a (#2773)-banMég egy kérdés ezzel kapcsolatban...ha listára hívunk
clear()-t, illetve ha újra inicializáljuk= [], akkor az ugyan az ?
Mármint arra gondolok, mint C++-ban, hogy ha újra assignolok valamit a változóhoz, és pl előtte nem toltam rá delete-t, akkor memóriaszivárgás lesz ? -
cog777
őstag
válasz
kovisoft
#2772
üzenetére
Haha... koszi.
Akkor (szamomra) marad a flag-es megoldas, hacsak nincs jobb otleted.
Csinalni kell egy listat flagekkel:
finished_task = [False, False, False, False]Mindegyik task a sajatjat True-ra allitja ha vegzett.
A vezerlo ciklusban pedig addig var az uj iteraciora, amig mind nem lesz True.
(Bar ahogy emlitettem, mivel nagy projektekkel dolgozunk, inkabb hajlok a KISS-re
es a szalnelkulisegre pont azert mert egyszerubb. ) -
cog777
őstag
válasz
asuspc96
#2769
üzenetére
"Arra gondolok ugye, hogy a listában ugye azokra a
thread-ekre van meg a referencia...ebből indul ki az okfejtésem. Szóval arra akarok kilyukadni, hogy így nem fognak egy idő után elszaporodni a szálak ? "Teljesen jol gondoltad
, ki kell torolni a listat, ha minden szal vegzett es ujrakezdeni. PC-n (RPi-n is kb PC operacios rendszer fut) szerintem teljesen mindegy ha eldobja a szalat es nem hasznositja ujra/tartja meg. Van rendes memoria kezeles stb. Nem ugy mint a kicsi esp32...
"És akkor hogy szedem ki az infót az egyes szálakból, hogy éppen hol tart ?
Gondolom akkor kéne valami szinkronizációs lépés is. Arra gondolok, hogy egyik szálból a másikba csak úgy nem fogok tudni átdobni infót."
Csak erdekesseg keppen mondtam, ha fontos lenne a nagyon rovid ido akkor meg a print utasitas is szamitana.
En meg a harverhez ertek kevesbe, mennyi a relek kapcsolasi ideje?
Version2 (kovisoft-nak es neked is koszonhetoen):while True:
for i in range(len(self.relay_threads)):
self.relay_threads[i].start()
for i in range(len(self.relay_threads)):
self.relay_threads[i].join()
self.relay_threads = [] -
cog777
őstag
válasz
kovisoft
#2768
üzenetére
Jah, tenyleg... akkor gondolom joinolni kell a szalakat a vegen,
while True:
for i in range(len(self.relay_threads)):
self.relay_threads[i].start()
for i in range(len(self.relay_threads)):
self.relay_threads[i].join()Vagy valami flag-et beallitani ha vegzett az osszes, addig var.
-
asuspc96
senior tag
"A kododbol kiindulva es legegyszerubben, berakod egy ciklusba
Mert ahogy latom, vegigfut a feladatokon aztan kilep a szalbol."
És a fentebb vázolt megoldásoddal, ugyan azok a szálak kezdenek újra munkába ?
Arra gondolok ugye, hogy a listában ugye azokra athread-ekre van meg a referencia...ebből indul ki az okfejtésem. Szóval arra akarok kilyukadni, hogy így nem fognak egy idő után elszaporodni a szálak ?
Ha jól értem a későbbi leírásod, ami nekem úgymond a szenzorból érkező jel, az lesz itt a kódodban a
Vezerlo ciklus-ban lévő feltétel, ha a szenzor igazat ad, indulhat újra a ciklus (?)"Bocs ha ezt mar tudtad, nem derult ki szamomra hogy mennyire vagy szakertoje a temanak."

Érdekel minden infó, szívom magamba mint a szivacs...amúgy csak ilyen hobbikódolós
"Mas: a print utasitas is lassit a fontos idoziteseket elronthatja. Ilyenkor szoktak kulon szalban/processzben futo naplozasba beletenni az esemenyeket..."
És akkor hogy szedem ki az infót az egyes szálakból, hogy éppen hol tart ?
Gondolom akkor kéne valami szinkronizációs lépés is. Arra gondolok, hogy egyik szálból a másikba csak úgy nem fogok tudni átdobni infót. -
cog777
őstag
válasz
asuspc96
#2766
üzenetére
A kododbol kiindulva es legegyszerubben, berakod egy ciklusba

while True:
for i in range(len(self.relay_threads)):
self.relay_threads[i].start()
Mert ahogy latom, vegigfut a feladatokon aztan kilep a szalbol.
(Csak erdekessegnek megemlitem hogy esp32-n futo micropythonon, ha sokszor keszul szal es lepsz ki belole akkor nem szabaditja fel a stack-et es par nap utan crash, igy kenytelen voltam allando 4 szalat kesziteni a halozati kezeleshez)Ha a releket viszonylag sok ideig tartod nyitva es zarva akkor vegulis az en egyszerubb megoldasom is mukodhet. Sok ido itt: masodperc.
Beagyazott rendszereknel szokas hogy van egy ciklus amelynek iteracioja rovid, tehat gyorsan vegig tud menni az osszes feladaton. Sot, ha mindig kivarja az idejet a kovetkezo iteraciora, hiaba vegzett az osszes feladataval, akkor remekul lehet az egyes feladatok idejet megtervezni es akar ido diagrammon abrazolni.
Tehat:
Vezerlo ciklus:
Rele 1 vezerles (nyit/zar/semmit nem csinal, tablazattol fuggoen)
Rele 2 vezerles (nyit/zar/semmit nem csinal, tablazattol fuggoen)
Rele 3 vezerles (nyit/zar/semmit nem csinal, tablazattol fuggoen)
Rele 4 vezerles (nyit/zar/semmit nem csinal, tablazattol fuggoen)
Var (legalabb 1ms legyen ez az iteracio)Ilyenkor teljes kontrol alatt van a vezerlese a hardvernek. Ez nem ritka implementacio, emlekszem hogy egy uzemben egy kis teljesitmenyu proci vezerelt komoly dolgokat igy, abban nem voltak szalak. (Ja, nem azert irom h ne probald ki a szalakat, csak mint erdekesseg)
Bocs ha ezt mar tudtad, nem derult ki szamomra hogy mennyire vagy szakertoje a temanak.
Mas: a print utasitas is lassit
a fontos idoziteseket elronthatja. Ilyenkor szoktak kulon szalban/processzben futo naplozasba beletenni az esemenyeket... de ha tobb mp-es idok vannak akkor nem szamit itt. -
asuspc96
senior tag
"Nalunk a vezerlo szoftvernel par ms a limit ami alatt reagalni kell az esemenyekre. Tehat meg nalunk sem kell egybol lekezelni, pedig GPS-t es hidraulikat kell kezelni."
Itt is konkrétan az utóbbira kellene. Lesz 4db hidrauliskus munkahenger, és azokat kell majd irányítani."Nem akartad elorol kezdeni ha vegigertel?"
Ez az egész végülis majd munkadarabokat fog csinálni, és az a terv, hogy amint végez majd, mozgásérzékelővel/lézerkapuval érzékelem, ha kiesett a szerszámból a termék, és egy amolyan "callback"-szerűen az fogja újra engedélyezni az új kört"Nem akartad elorol kezdeni ha vegigertel?"
Ezt hogyan lehetne megvalósítani amúgy ?
Úgyis kelleni fog majd
-
asuspc96
senior tag
Jelenleg most így valósítottam meg:
def work_cycle(self, up_times, sleep_times, gpio, id):for i in range(len(sleep_times)):down = float(sleep_times[i])print(id, '. sleeping to ', down, ' sec')gpio.off()sleep(down)if i < len(up_times):high = round(float(up_times[i][1]) - float(up_times[i][0]), 2)print(id, '. going high to ', high, ' sec')gpio.on()sleep(high)def start_work(self):for i in range(len(self.relay_sleep_times)):self.relay_threads.append(threading.Thread(target=self.work_cycle,args=(self.relay_up_times[i + 1], self.relay_sleep_times[i], self.relay_gpios[i], i)))for i in range(len(self.relay_threads)):self.relay_threads[i].start()Most az első teszteknek alávetettem tegnap, és egészen azt csinálja, amit szeretnék, úgyh nincs nagy para (egyenlőre)
-
cog777
őstag
válasz
asuspc96
#2757
üzenetére
Csak hangosan gondolkodom:
Kerdes az hogy mennyire fontos az hogy egyszerre kapcsoljanak a relek.Python csak 1 CPU-t tud hasznositani tehat mindenkeppen kapcsolgat a szalak kozott.
Ha eleg az hogy (hasra utok) 0.5 ms alatt kapcsoljon mind a negy rele, akkor akar a szalakat is elhagyhatod, igy egyszerubb lesz.
Pl csinalhatsz egy ciklust, abban vegig mesz mind a 4 relen, majd kivarod az egysegnyi idot, kezded elolrol.En valoszinuleg ezt csinalnam, es kimernem hogy mennyi ido alatt kapcsol 4 relet. Szerintem RPi gyors hozza.
Szalakkal valoszinuleg valamivel/kicsit jobb lenne, de ez sem parhuzamos, es nem biztos h megeri hogy 100us-ot nyertel

Persze ha tanulni akarsz, akkor okes.
Ha tenyleg parhuzamossagot szeretnel akkor inditanod kell kulon processzeket es vezerelni oket, de nem biztos h megeri.
Nalunk a vezerlo szoftvernel par ms a limit ami alatt reagalni kell az esemenyekre. Tehat meg nalunk sem kell egybol lekezelni, pedig GPS-t es hidraulikat kell kezelni.
-
asuspc96
senior tag
válasz
justmemory
#2760
üzenetére
igen, a
time.sleep()benne lesz a megoldásban, a fentebb írtsleep time-okkal, annyi biztos.
De akkor kipróbálom ezt a threading-et.
Erre tökéletes a beépítettthreadinglibrary, vagy ajánlatosabb valami mást nézni ?
(Nem vagyok nagy pythonos, azért érdeklődöm) -
justmemory
senior tag
válasz
asuspc96
#2759
üzenetére
Hát... az ütemezés lényege, hogy pontosan történjen minden
Olvastam arról egy cikket régen, hogy az időbeliség hogyan alakul, hiszen a kódnak le kell futnia, stb... Ilyenformán egyszerre nehéz elindítani bármit egy sima kóddal is, hiszen minden kódsor egymás után van... de pl.: egy bash cron-al is tehetsz próbát...
Én olyasmire tudnék gondolni, hogy akártime.sleep()-et is tehetsz bele, stb. -
asuspc96
senior tag
válasz
justmemory
#2758
üzenetére
A szálakkal az a baj, mint ahogy említettem fentebb is, hogy nem biztos, hogy az időbeni lefutása az úgy lesz garantálva, ahogy én szeretném.
Lehet, hogy az ütemező éppenséggel másképp fogja csinálni...de természetesen lehet, h igazad van
Mire gondolsz egész pontosan ?
-
asuspc96
senior tag
Helló,
Tudtok valami módszert arra, hogy hogyan lehet egyszerre párhuzamosan elindítani 4 munkafolyamatot ?
Hellyel közzel valamilyen szinten köze van a szálakhoz amire gondolok, de mégse teljesen.Leírom a konkrét problémám, h lássátok a kontextust:
Adva van egy raspberry, illetve egy relémodul amelyet az előbb említett eszközzel szeretnék vezérelni. A cél az lenne, hogy megadok intervallumokat, pl:1-3, 5-11, 14-28, 32-76, 81-90
0-2, 3-8, 9-14, 16-38
2-8, 9-16, 19-23, 24-45
10-12, 14-18, 21-24, 25-87Majd ezek alapján legenerálom a számomra hasznos infókat:
relay times: 1 : [['1', '3'], ['5', '11'], ['14', '28'], ['32', '76'], ['81', '90']]sleep times: 1 : ['1', 2, 3, 4, 5, 10]relay times: 2 : [['0', '2'], ['3', '8'], ['9', '14'], ['16', '38']]sleep times: 2 : ['0', 1, 1, 2, 62]relay times: 3 : [['2', '8'], ['9', '16'], ['19', '23'], ['24', '45']]sleep times: 3 : ['2', 1, 3, 1, 55]relay times: 4 : [['10', '12'], ['14', '18'], ['21', '24'], ['25', '87']]sleep times: 4 : ['10', 2, 3, 1, 13]total work cycle time: ['100']
A lényeg az lenne, h a 4db relét egyszerre elindítom, és az időzítéseknek megfelelően egy időben párhuzamosan működnek.Nézegettem egy megoldást erre, amivel szimpatizáltam, de nem vagyok benne biztos, h ezzel a megoldással garantálva lenne az időbeliség:
[https://github.com/celery/celery]Van erre valami megoldás ?
-
cog777
őstag
-
atesss
addikt
Köszi a tippet, megnézem.
Viszont az jutott még eszembe, hogy ha az eszközöm egy Raspberry Pi, akkor a logolásnál az SD-kártya írási terhelésére azért lehet oda kellene figyelni.
Vagy lehet valami speciálisabb beállítás / másik modul, ami - ugyan adott esetben lassabb vagy más szempontból hátrányos - de cserébe jobban kíméli az SD-kártyát ? -
cog777
őstag
logging modulba meret alapu es ido alapu rotalo talalhato. Jol mukodnek. Ha kell tomorites, akkor hasznalhatod a gzip modult.
logHandler = logging.handlers.RotatingFileHandler(filename, maxBytes=maxBytes, backupCount=backupCount)
logHandler.rotator = self._rotating
def _rotating(self, source, dest):
f_in = open(source, 'rb')
f_out = gzip.open(dest, 'wb')
f_out.writelines(f_in)
f_out.close()
f_in.close()
os.remove(source) -
cog777
őstag
Ha python-ban gzip modult hasznalva tomoritett naplofajlt keszitek. Valahogy a tomoritett fajl nagyobb meretu mint az eredeti szoveges fajl. Lehet hogy a hozzafuzes miatt?
Van erre megoldas hogy szoveget hozzaadjunk tomoritett allomanyhoz?ls -la
total 1528
drwxr-xr-x 2 zoltan zoltan 4096 Jun 1 10:58 .
drwxr-xr-x 7 zoltan zoltan 4096 Jun 1 10:58 ..
-rw-r--r-- 1 zoltan zoltan 588566 Jun 1 10:55 esp32.log
-rw-r--r-- 1 zoltan zoltan 964665 Jun 1 10:58 esp32.log.gzItt a forras (programkod formazasa nem mukodik):
import serial
import gzip
import datetime
with serial.Serial('/dev/ttyUSB1', 115200, timeout=None) as ser:
while True:
line = ser.readline().decode()
now_str = datetime.datetime.utcnow().strftime("%d-%m-%Y (%H:%M:%S.%f)")
line = "[{}] | {}".format(now_str, line)
print(line)
with gzip.open('esp32.log.gz', 'at') as f:
f.write(line) -
justmemory
senior tag
Nem tudom, hogy a rendszer különbözősége-e... én chroot-olt kali image-en futtattam...

Bevallom, hogy nekem csak hobbi a (python) programozás; logolni nem szoktam... A threading kapcsán is a netet túrtam rengeteget anno...
Lehet, hogy érdemes már az elején a 3-asra ráállni, hiszen a 2 támogatottsága megszűnt és lassan kivezetik.
-
atesss
addikt
válasz
justmemory
#2750
üzenetére
pi@raspberrypi4:~ $ python
Python 2.7.16 (default, Oct 10 2019, 22:02:15)
[GCC 8.3.0] on linux2
Hmm, lehet az oprendszer adja a különbséget.Logolásra milyen modult tudtok ajánlani ?
Én most egy ilyen infót találtam rá: [link]
Inkább már Python3-alapú legyen.A threading-ről is van itt fent egy elég jónak tűnő tutorial: [link] , ez alapján csináltam a saját fenti kódomat is.
-
justmemory
senior tag
"Nem feltétlenül kell a process ID-t elmenteni, meghívhatod a pidof-ot "
Ami tulajdonképpen azt csinálja, nem ?
De, igen...
Én arra gondoltam elsőre, hogy nem kell az elején elmenteni, mert utólag is le tudod kérdezni.Ami hátrány, hogy most kétszer íródik ki a PID a terminal-ban.
Kíváncsiságból lefuttattam nálam is (2.7.3-as Python), csak annyit és csakis annyit ír ki a terminál, hogy A futo mplayer folyamatazonositoja: 17774. Tehát amit kell... -
atesss
addikt
válasz
justmemory
#2748
üzenetére
Subprocess-re én akkor még nem így gondoltam. De utánanéztem, és így kellene, igen.
Csak ez így már összességében azért bonyolultabb."Nem feltétlenül kell a process ID-t elmenteni, meghívhatod a pidof-ot "
Ami tulajdonképpen azt csinálja, nem ?Jelenleg eddig jutottam:
import threadingdef mplayer(Patch):startcommand = 'mplayer ' + Patchos.system(startcommand)returnthreads = []WavPathname = '/home/pi/ ... _HU_1.wav'mplayerThread = threading.Thread(target=mplayer, args=(WavPathname,))threads.append(mplayerThread)mplayerThread.start()os.system("pidof mplayer")mplayer_pid = subprocess.check_output(["pidof", "mplayer"])print "A futo mplayer folyamatazonositoja: " + str(mplayer_pid)
Ami hátrány, hogy most kétszer íródik ki a PID a terminal-ban.
Olvastam [link] hogy Python 3 alatt már van valami más megoldás is erre, de még nem váltottam át rá. -
justmemory
senior tag
A
thread()szolgál arra, hogy egyszerre több szál fusson a progin belül - ha erre gondolsz, mint subprocess, akkor igen, úgy kellene indítani szerintem. Arról tudsz akár visszajelzést is kapni, ha leáll/lefut. Nem feltétlenül kell a process ID-t elmenteni, meghívhatod apidof-ot (mint bash parancs); ezzel annyi gond van, hogy ha mondjuk több mplayer is fut egyszerre, akkor nehezen fogod tudni, hogy melyik melyik (csak mondjuk ha az indítás után rögtön futtatod a pidof-ot és kizárásos alapon eltárolod az azonosítót). De ennek ismeretében is, meg a thread kezelésénél is kvázi bármikor leállíthatod. Az, hogy éppen hol tart a lejátszásnál... Hát igen, nehezebben fogod tudni; annyira nem ástam bele magam, hogy van-e mplayer-hez esetleg python modul vagy simán bash-al ki lehet-e szedni belőle, hogy éppen hol tart. Ha utóbbit lehet, akkor elvileg arra is tudszos.systemhívást csinálni. -
atesss
addikt
válasz
justmemory
#2746
üzenetére
Most próbálgatom az mplayer-t.
Egy dolog ezzel az indítással viszont már elsőre kijött mint probléma:
Így a főprogram futása megakad, amíg fut az mplayer.
Hogy ne így legyen, ahhoz subprocess-ként kellene indítanom ?
Úgy viszont onnantól meg kicsit nehezebb lesz kézbentartani a futását. (Nem kapok közvetlen visszajelzést mikor végzett, azt is nehezebben tudhatom meg épp hol tart a lejátszással, nehezebb instant leállítani, stb.)
Hogy ezek is működjenek megbízhatóan, ahhoz jól gondom hogy legelőször is a process ID-t kellene lementenem akkor amikor indítom ? -
atesss
addikt
válasz
sztanozs
#2743
üzenetére
A VLC esetében arra gondoltam, hogy az ezzel most megszerzett tapasztalatokat később majd kibővítve bonyolultabb projektekben is hasznosítani tudnám.
(Pl. van olyan tervem is, hogy majd egy saját, jól testreszabható, eseményvezérelhetőséget is tudó CCTV-kamerakép néző alkalmazást csinálnék, első körben szabadulószobák számára. VLC-vel, és elsősorban RTSP-vel.)
De mondjuk ez egy más volumenű projekt, lehet akkor mégsem most állnák neki a VLC vezérlésbe való beletanulásnak.Az mplayer-t úgy indítanám akkor Python-ból, hogy az minden lejátszáshoz létrehozna egy terminal ablakot (amit aztán be is zárna) ?
Vagy pedig ez nem szükséges ?Egy hátránya lehet még esetleg az mplayer-nek.
Azzal hogy "nem lesz GUI/képernyő" nem mondtam teljesen igazat.
Tervbe van egy olyan, hogy ugyanez a Raspberry párhuzamosan csinálna egy másik feladatot, egy TV-képernyőn való megjelenítést is (képcsöves a hely tematikája miatt, analóg CVBS-en). Ez elsősorban egy visszaszámláló (videofájl) lenne ami mindig fut, de külön-külön beküldött képek vagy rövid hangok/videók is lehetnének akár amik ezt rövid időre megszakítják.
Ez a terv persze későbbi, de a diktafon funkciót már most úgy csinálnám meg hogy ezzel ne ütközhessen.
A két külön alkalmazás hangjának fizikai elválasztását kétféleképpen is megoldhatom:
1. A sztereo egyik és másik csatornája. 2. Az egyik funkció a beépített hangkártyával megy, a másik pedig egy I2S-es kis erősítővel.
(Illetve 3. USB-s hangkártya, bár ezzel elektronikailag rossz tapasztaltaim vannak (áthallás), úgyhogy ezt kerülném. 4. relé a hangjelre, de ezt is kerülném.)
Ezt a TV-s megjelenítést a Pi Presents [link] vezérlésével/testreszabásával terveztem megcsinálni.
Az hogy más fut GUI-val a háttérben, nem probléma, mert átrakom a PiPresents-et Alwas On Top-ra.
De viszont ez a toolkit az audio fájlok lejátszását mplayer-el csinálja, legalábbis alapból. -
atesss
addikt
Üdv !
Pár kicsi pl. indító-ellenőrző célú, illetve Raspberry GPIO bemenetet kezelő scriptet írtam vagy "összeollóztam" Pythonban már az elmúlt években, de nemrég kezdtem el komolyabban, úgymond teljes rendszerben is tanulni.
Eddig elsősorban C-t és AVR-C-t tanultam egyetemen + azt tovább magasabb szintre is hobby célból, de az elmúlt pár évben sajnos keveset használtam.
Most - a Python "alapok" tanulásával kb. párhuzamosan - a munkámhoz kapcsolódóan egy szabadulószobában használandó "üzenetrögzítő" játékelemet kezdtem el programozni Raspberry-re. GUI nem lesz erre a célra (sőt kijelző sem lesz rajta). Egyelőre python2-ben kezdtem el, de később majd biztos átváltom python3-ra.Elég sok része már működik is, de most egy területen elakadtam :
Hangfájlokat indítanék RFID-kártyák érzékelésére (nyelvenként kb. 5db fájl, kb. 10-25s, jelenleg wav). VLC-vel tenném, ezt azért is lenne célszerű, mert pl. omxplayer-el ellentétben elég könnyen átemelhető majd PC-s környezetbe is máshoz.
Első körben olyat csináltam, hogy minden egyes hangfájlhoz tartozik egy shell script amiben egy külön terminal-al indul egy teljes VLC player. A leállítást pedig os.system("pkill vlc") - vel csináltam.
A hangfájlok hosszát itt még egy külön config fájlból töltöm be
(az audio erősítőt is kapcsolom ennek függvényében).
Ugyan működik, de hát nem egy túl szép és erőforrás-gazdaságos megoldás...Az lenne a jó, ha nyelvváltáskor betölteném mind az 5db hangfájlt egy lejátszási listába,
és utána már csak abból dolgoznék.
Találtam is egy vlc-ctrl csomagot [link]
Ezt nagyon könnyű használni, de sajnos eléggé limitált, a dokumentációja meg nulla.
Eléggé körülményesnek tűnik vele akár csak egy lejátszási lista pl. adott elemére lépni.
Helyette az úgymond "hivatalos" VLC Python bindings-et lenne jobb használnom: [link]
Ez viszont bonyolultabb, már az indítással is bajban vagyok elsőre.
Nekem az jött le, hogy itt kb. az ablakot is nekem kellene létrehoznom.
Nem tudtok erre valamilyen elsőre is egyszerűbben használható megoldást ? -
Siriusb
veterán
válasz
sztanozs
#2739
üzenetére
A tkinter felület olyan bűnronda, hogy amikor először megnéztem, azonnal menekültem. Pár hete észrevettem, hogy a wxwidget már megy python 3-mal, nosza feltelepítettem és elkezdtünk ismerkedni. Aztán rájöttem, hogy gtk3-ba van bedrótozva (Linux). Mivel amúgy is azt használtam, nem fogok még egy plusz layer-t használni.
-
axioma
veterán
-
axioma
veterán
Azt az 1,6-t hogyan kell ertelmezni? Az 1. _es_ 6. elemet kered? Csak az 1.-t es a 6-os egy nem hasznalt adat? (az
i[0]-t erolteto megoldasod lehet, hogy azt akarna, ha nalad konkretan egy darab tuple-bol allna a lista es a 0. elemet hasznalja ez a cucc, kerdes hogy a minta mennyire erre a konkret felhasznalasra szolt). Vagy 1-tol 6-ig (incl vagy excl)? Ha nem tudsz az input jelenteserol semmit, akkor tulkepp az egesz helyett beirhatod hogyselection[0]es ha nem a kert eredmenyt adja majd lehet tovabbmenni. A masik tipp aselection[0]:selection[1]ertelmezes, ha az tartomany-megjeloleskent erkezik. -
moseras
tag
Hello,
> selection egy tuple ez pl (1, 6)
> (y = [i[0] for i in selection]) errort dob.Ha selection egy tuple, akkor lehet selection[0], selection[1], stb. eleme. A for végigmegy a selection elemein, selection[0], selection[1], és így tovább, amennyi van. Ezt veszi fel az i.
De Te ennek az i-nek a 0.-ik elemét akarod, az pedig egy Int, konkrétan az 1-es szám, annak nincs 0.-ik eleme. Egy Int-nek nincs nulladik eleme.
> self.clsmedialist[selection]
Nem többdimenziós hozzáférést szeretnél ?
self.clsmedialist[selection[0]][selection[1]] ???
Szerintem python-ban nem lehet tuple-t beadni többdimenziós index-nek, sem vesszővel elválasztott Int-eket.
a[1,2] helyett a[1][2] kellene, nem ?
-
togvau
senior tag
hogy lehet ezt megoldani? A bemenet selection nevű field ez pl (1, 6) állítólag tuple.
Egy list ezen elemeit elemeit akarom kijelölni:self.clsmedialist[selection]
de elszáll hogyTypeError: list indices must be integers or slices, not tupleMost mit akar? Integer array-t? Rákerestem, neten, az ott leírt megoldás (
y = [i[0] for i in selection]) errort dob. -
Siriusb
veterán
Pythonban menet közben is létrehozhatsz változókat, sőt még a típusát is váltogathatod, általában nem kell előre definiálni semmit. Persze vannak esetek, ahol szükséges, pl. egy cikluson belül append-del adsz értékeket egy listához.
Így hát az adott változó a ciklusodban utolsóként felvett értékkel létezik tovább az adott környezeten belül, hiszen amennyiben ez egy osztályon, függvényen belül történik, kívül már nem lesz elérhető. -
Lacc
aktív tag
Pythonban a for ciklus értékadással egyenlő? Én azt hittem, mint a Java-ban a j változó csak a for cikluson belül él (scope, angolul). De úgy nézz ki, azon kívül is.
for i in range(0,3):
... for j in range(0,3):
... continue
... print(i, j)Másik példánál is látszik.
for a in range(0,3):
continue
print(a)
Mindkettőnél az a és j változóknak 2-es lesz az értéke. Megnéztem, még PHP-ban is igaz ez, de Java-ban nem.Ennek van valami különleges neve, hogy a "for cikluson kívül is elérhető a változó"? Vagy hogy a "for ciklus értékadó operátor". Szívesen olvasnék erről többet a témában. De hiba próbáltam ki angolul google-ben nem azt a találatot kapom, amit akarok.
-
cousin333
addikt
válasz
cousin333
#2723
üzenetére
Lejárt a szerkesztési időm...
Érdekesség: 2019-es Python fejlesztői felmérés a JetBrains-től (többek között A PyCharm fejlesztői). Pár érdekesség:
- 84% elsődleges nyelvként használja!
- nem meglepő módon leginkább web fejlesztésre és adatelemzésre használják
- bár az arányuk rohamosan csökken, 10% még mindig a Python 2-t nyúzza
- a Python 3 felhasználók fele a 3.7-es változatnál jár, a 3.8 kb. 11%-on áll
- webfejlesztés: dominánsan Flask és Django
- adatelemzés: NumPy és Pandas (nem meglepő módon), bár ez szorosabb
- unit testing: pytest és unittest
- adatbázis: PostgreSQL, MySQL, SQLite szinte fej-fej mellett
- operációs rendszer: Linux > Windows > MacOS
- IDE: PyCharm, VSCode, Vim/Jupyter Notebook -
cousin333
addikt
Érdekesség: 2019-es Python fejlesztői felmérés a JetBrains-től (többek között A PyCharm fejlesztői). Mire használják leginkább a Pythont? Nem meglepő módon web fejlesztésre és adatelemzésre.
-
Siriusb
veterán
Szerintem már nem látom a fától az erdőt és nem tudom megoldani:
string = "sallala 5 337 2 351 subidu"Miként tudom regex-szel kiszedni az
5337 és 5351számokat? Regex mohósága bekavar nálam. A csavar az hogy előre nem lehet tudni, hány számjegyből fognak állni a számok (1 és 6 között), de az ezres elválasztás az biztosan szóköz. -
-
Janos46
tag
válasz
kovisoft
#2714
üzenetére
3-ast használok. Az átküldött program F pontját futtasd le. Ezt írja ki:
Traceback (most recent call last):
File "/media/pi/FEKETE/Kesz_lesz/Pyrthon_oktato.py", line 126, in <module>
mylcd.lcd_display_string(get_ip_address('eth0'), 2)
File "/media/pi/FEKETE/Kesz_lesz/Pyrthon_oktato.py", line 123, in get_ip_address
struct.pack('256s', ifname[:15])
struct.error: argument for 's' must be a bytes object
------------------------------------------------------------
Ez pedig az ifconfig:
pi@raspberrypi:~ $ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.137 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 fe80::e092:4c9a:94f4:d2e1 prefixlen 64 scopeid 0x20<link>
ether dc:a6:32:72:44:4a txqueuelen 1000 (Ethernet)
RX packets 1367 bytes 1014588 (990.8 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 887 bytes 125612 (122.6 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 90 bytes 45284 (44.2 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 90 bytes 45284 (44.2 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.133 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 fe80::a832:8cdf:a38b:1346 prefixlen 64 scopeid 0x20<link>
ether dc:a6:32:72:44:4c txqueuelen 1000 (Ethernet)
RX packets 142 bytes 20973 (20.4 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 41 bytes 7175 (7.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
pi@raspberrypi:~ $ -
Janos46
tag
válasz
kovisoft
#2710
üzenetére
Ez az az oldal, amit már megcsináltam és abból csak az nem futtatható. Egyébként privben elküldöm a művemet (remélem nem veszed zokon, és hát nem is vagy rászorulva). Lenne helyette más program is, csak a leírás miatt használnám a benne lévőt.
https://www.circuitbasics.com/raspberry-pi-i2c-lcd-set-up-and-programming/
Egyébként az alábbit is berakhatnám helyette, de a leírást nem tudnám produkálni, ráadásul én nem tudom megoldani az LCD-n való megjelenítést. Nekem a google fordító mindig be van kapcsolva, és így nem okoz problémát semmilyen nyelv. LOL.import socketimport requestsurl = "http://checkip.dyndns.org"request = requests.get(url)clean = request.text.split(': ', 1)[1]your_ip = clean.split('</body></html>', 1)[0]def getNetworkIp():s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)s.connect(('<broadcast>', 0))return s.getsockname()[0]print (("Külső IP: "),(your_ip))print (("Saját IP: "),(getNetworkIp()))
Ezért kértem a segítséget. -
Janos46
tag
Sziasztok.
Van egy kezdőknek szóló oktató program sorozat,ami az LCD1602-re ír ki. és amit szeretnék összefűzni. Sajnos ez az egy nem műkszik. Meg tudná valaki gyógyítani és visszaküldeni?
Előre is köszönnémimport I2C_LCD_driverimport socketimport fcntlimport structmylcd = I2C_LCD_driver.lcd()def get_ip_address(ifname):s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)return socket.inet_ntoa(fcntl.ioctl(s.fileno(),0x8915,struct.pack('256s', ifname[:15]))[20:24])mylcd.lcd_display_string("IP Address:", 1)mylcd.lcd_display_string(get_ip_address('eth0'), 2) -
togvau
senior tag
Még nem akarok machine learning izéket programozni, csak pythonozn simán.
Eclipse plugint próbáltam, elég buta a java-hoz képest, ahogya VScode is.
Ami hiányszik, az a normálisabb dokumentáció a metódusokhoz (bár ezek szerint az nincs, mindennél google a barátom), és az, hogy a kiegészíténél ne csak a neveket egészítse ki, hanem mondjuk kidoba a metódus paraméterezésének vázát is.
Na meg az is fura, hogy a vscode, ritkán kezeli az importokat, leggyakrabban manuálisan kell odaírnom.
Az is hiányzik, hogy mondjuk egy kattintásra létehozza a konstruktort
Ez ilyen? Jobb ha megszokom? Vagy a pycharmot is fel kéne raknom? -
-
togvau
senior tag
python nab vagyok, Java, és C# tapasztalatom van.
Hogy állítsam össze a fejlesztőkörnyezetemet? Milyen IDE ajánlott? Eddig Eclipse, és VSE-t használtam, na meg SQL-re notepad++-t
Multiplatform irányban maradnék, de főleg vindózos gépen fejlesztek, linuxon "élesezek". -
Rimuru
veterán
Új hozzászólás Aktív témák
- OLED TV topic
- Assetto Corsa Rally
- Magga: PLEX: multimédia az egész lakásban
- A Windows 11 nem akarja ránk erőltetni az AI applikációkat – vagy mégis?
- Samsung kuponkunyeráló
- Ingatlanos topic!
- Diablo IV
- Ezt nézed TikTokon és YouTube-on a telefonodon
- gban: Ingyen kellene, de tegnapra
- btz: Internet fejlesztés országosan!
- További aktív témák...
- HIBÁTLAN iPhone 13 Pro 128GB Graphite -1 ÉV GARANCIA - Kártyafüggetlen, MS3747, 100% Akkumulátor
- LG 83B4 - 83" OLED - 4K 120Hz 1ms - NVIDIA G-Sync - FreeSync Premium - HDMI 2.1 - PS5 és Xbox Ready
- ÁRGARANCIA!Épített KomPhone i5 14600KF 32/64GB RAM RX 7800 XT 16GB GAMER PC termékbeszámítással
- BESZÁMÍTÁS! ASRock B550M R5 5600X 32GB DDR4 512GB SSD MSI SuprimX RTX 3070Ti 8GB Zalman Z1 PLUS 750W
- Apple iPhone 13 128GB, Kártyafüggetlen, 1 Év Garanciával
Állásajánlatok
Cég: Laptopszaki Kft.
Város: Budapest
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest


Én arra gondoltam elsőre, hogy nem kell az elején elmenteni, mert utólag is le tudod kérdezni.

