Új hozzászólás Aktív témák
-
cousin333
addikt
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
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:

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
válasz
concret_hp
#2888
üzenetére
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.
-
sonar
addikt
Aki még nem olvasta volna: A Microsofthoz igazol Guido van Rossum, a Python atyja
-
justmemory
senior tag
válasz
Silεncε
#2885
üzenetére
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
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?
-
Silεncε
őstag
válasz
justmemory
#2882
üzenetére
Fixme, de a GIL miatt, ha csak threadeket indít, nem fogja kifagyasztani a GUI-t is?
-
kovisoft
őstag
válasz
Jhuzaka
#2880
üzenetére
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
válasz
concret_hp
#2881
üzenetére
Vagy beolvasod hogy a tartalma 1 vagy semmi. Mielott elinditod a processt, nullazod a tartalmat.
-
justmemory
senior tag
válasz
concret_hp
#2881
üzenetére
Threading nem lenne megoldás...?
-
concret_hp
addikt
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
friss újonc
válasz
kovisoft
#2877
üzenetére
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öka 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
válasz
concret_hp
#2878
üzenetére
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
válasz
Silεncε
#2870
üzenetére
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
válasz
Jhuzaka
#2876
üzenetére
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-13Vagy 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
friss ú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
válasz
xAttilax
#2874
üzenetére
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 pyserialBocs, 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.
köszönöm. -
Siriusb
veterán
válasz
concret_hp
#2869
üzenetére
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.
-
cog777
őstag
válasz
concret_hp
#2867
üzenetére
Kivy-t is megnezheted.
-
Silεncε
őstag
válasz
concret_hp
#2869
üzenetére
É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.
-
Silεncε
őstag
válasz
concret_hp
#2867
üzenetére
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
-
FrozeN`
tag
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. -
-
Mr Dini
addikt
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.

-
sonar
addikt
Abszolút csak tipp, setuptools-ból a legutolsó van fent?
pip3 install --upgrade setuptoolsNá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 -
kovisoft
őstag
válasz
concret_hp
#2851
üzenetére
unicodedata.normalize('NFKD', s).encode('ascii', 'ignore').decode('utf-8')
'ou'
unicodedata.normalize('NFKD', s).encode('ascii', 'ignore').decode('utf-8') == 'ou'
True -
Cucuska2
addikt
válasz
concret_hp
#2847
üzenetére
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
válasz
concret_hp
#2847
üzenetére
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
-
atty_hor
tag
válasz
concret_hp
#2840
üzenetére
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
válasz
kovisoft
#2841
üzenetére
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
válasz
concret_hp
#2840
üzenetére
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
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 = 0x30def __init__(self, interface):self.port = interfaceself.portA_status = Noneself.portB_status = Nonedef connect(self):.... # connect heredef 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_statusself.update_ports()port = self.portA_statusreturn port & port_old@propertydef id(self):return self.port.read(<id_reg>)@propertydef Switch1(self):return True if self.port_status & self.MASK_SWITCH else FalseEbben 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_arrayprint("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 ??
-
atesss
addikt
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-timport threadingimport timefrom datetime import datetimeTIMER_INTERVAL = 5.0last_hit_ts = 0.0def mylog():now = datetime.now()print(now.strftime("%H:%M:%S.%f"))# Munka kezdetenek meresemunka_start = time.monotonic()print("Inditjuk a feladatot")# 2mp-et vesz igenybetime.sleep(2.0)# Munka vegenek meresemunka_end = time.monotonic()# timer korrekcioeltelt_ido = munka_end - munka_startmaradek_ido = TIMER_INTERVAL - eltelt_idoprint('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 pythonbanimport threadingimport timefrom datetime import datetimedef 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
válasz
cousin333
#2829
üzenetére
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_COUNTMICROSWITCH_COUNT = 4global MICROBUTTON_COUNTMICROBUTTON_COUNT = 2global NC_COUNTNC_COUNT = 2i2c_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_statedef i2c_io_printer(i2c_io_readed_array_reversed, i2c_io_state):global i2c_io_readed_array_reversed_previousprint("----")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_reversedAmi 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. -
cog777
őstag
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

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


" 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
válasz
cousin333
#2829
üzenetére
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
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
TrueUgyanez dataclass-al:
from dataclasses import dataclass@dataclassclass InputPorts:Switch1: boolSwitch2: boolSwitch3: boolSwitch4: boolButton1: boolButton2: boolNC7: boolNC8: bool...port_state = InputPorts(*i2c_io_readed_array)A használata kb. ugyanaz, mint a namedtuple-nek.
-
cousin333
addikt
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
válasz
Silεncε
#2818
üzenetére
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). -
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 = 0x48ADCCh0_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_addresschannel = get_channel_from_name(channel_name)try:bus.write_byte(I2C_address,channel)except IOError:passtry:adc_dummyread = bus.read_byte(I2C_address)except IOError:passtime.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_valuedef get_channel_from_name(channel_name):A0 = 0x40A1 = 0x41A2 = 0x42A3 = 0x43if channel_name == "A0":channel = A0if channel_name == "A1":channel = A1if channel_name == "A2":channel = A2if 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
válasz
linuxalpine
#2815
üzenetére
Oh, akkor egyreszt bocs hogy belevau masreszt koszi, en is tanultam valamit.
-
axioma
veterán
válasz
linuxalpine
#2813
üzenetére
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...
-
válasz
concret_hp
#2811
üzenetére
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?
-
válasz
Siriusb
#2808
üzenetére
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. -
-
olivera88
veterán
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. -
-
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.macroHa meg nem aktiválom ecmwf-t anacondával akkor meg ilyen hibát dob.

Ezekszerint mindenképpen szükséges az aktiválás
, csak az baj amit az előbb is irtam h csak terminálból tudok futattni lassú modszerrel. -
Janos46
tag
Sziawztok!
Az 1.3" OLED probléma megoldva.#!/usr/bin/env python# "Hello World" for display sh1106 in Raspberry Pi# 2018 https://ph0en1x.netfrom device import sh1106from render import canvasfrom PIL import ImageFontfrom time import sleepdevice = sh1106(port=1, address=0x3C, width=132, height=64) # for RPi rev 2 port(smbus) = 1font = 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. -
oszi666
őstag
hiba volt, törölhető
Új hozzászólás Aktív témák
- Nintendo Switch 2
- Azonnali alaplapos kérdések órája
- Spórolós topik
- World of Tanks - MMO
- Samsung Galaxy Felhasználók OFF topicja
- Fizetős szoftverek ingyen vagy kedvezményesen
- Milyen videókártyát?
- Samsung Galaxy A54 - türelemjáték
- Xiaomi 13T és 13T Pro - nincs tétlenkedés
- Apple MacBook
- További aktív témák...
- Bomba ár! Fujitsu Lifebook T936: i5-6G I 8GB I 256SSD I 13,3" FHD Touch I Cam I W10 I Gari!
- CTO Bontott 0perces TÜZES EZÜST MacBook Air 13.6" M4 10C/1G 16GB 512GB Gar.: 1 év APPLE világgar
- Bomba ár! Dell Vostro 5490 - i5-10GEN I 16GB I 256SSD I 14" FHD I HDMI I Cam I W11 I Gari!
- MacBook Pro 13, 14, 15, 16, MacBook Air M1, M2 M3 M4 bill magyarosítás lézerrel / sapkacserével
- ÁRGARANCIA! Épített KomPhone Ultra 9 285K 32/64GB RAM RTX 5070 Ti 16GB GAMER PC termékbeszámítással
Állásajánlatok
Cég: Laptopszaki Kft.
Város: Budapest
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest









