Új hozzászólás Aktív témák
-
oszi666
őstag
hiba volt, törölhető[ Szerkesztve ]
It is not birth, marriage, or death, but gastrulation, which is truly the most important time in your life.
-
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.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.
Artillery, lelkes újonc vagyok, tanulni akarok!
-
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.
[ Szerkesztve ]
LG Velvet 5G Android 11 - Windows 10 Pro x64 & Debian 11 Bullseye - WoWS unsinkable_sam_
-
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.LG Velvet 5G Android 11 - Windows 10 Pro x64 & Debian 11 Bullseye - WoWS unsinkable_sam_
-
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. -
nagyúr
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.
[ Szerkesztve ]
Tudod, mit jelent az, hogy nemezis? Az érintett, erősebb fél kinyilatkoztatása a méltó büntetés mértékét illetően. Az érintett fél jelen esetben egy szadista állat... én.
-
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?
vagy fullba vagy sehogy :D
-
sh4d0w
félisten
válasz concret_hp #2811 üzenetére
Persze, hozzáadod egy listához és azt a végén egyben írod ki.
https://www.coreinfinity.tech
-
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...
-
axioma
veterán
válasz linuxalpine #2815 üzenetére
Oh, akkor egyreszt bocs hogy belevau masreszt koszi, en is tanultam valamit.
-
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 ?[ Szerkesztve ]
-
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
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...[ Szerkesztve ]
-
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.[ Szerkesztve ]
-
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))
[ Szerkesztve ]
"We spared no expense"
-
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
@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.
[ Szerkesztve ]
"We spared no expense"
-
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).[ Szerkesztve ]
-
cog777
senior tag
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
[ Szerkesztve ]
HP ZBook Studio 15.6 G8 Mobile Workstation - Windows 11
-
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_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.[ Szerkesztve ]
-
cog777
senior tag
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 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.
[ Szerkesztve ]
HP ZBook Studio 15.6 G8 Mobile Workstation - Windows 11
-
cog777
senior tag
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 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()
HP ZBook Studio 15.6 G8 Mobile Workstation - Windows 11
-
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.[ Szerkesztve ]
-
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 ??
[ Szerkesztve ]
-
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 = 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)
[ Szerkesztve ]
"We spared no expense"
-
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
ž -> zvagy fullba vagy sehogy :D
-
kovisoft
őstag
válasz concret_hp #2840 üzenetére
Nézd meg ezt.
-
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.
vagy fullba vagy sehogy :D
-
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[ Szerkesztve ]
-
concret_hp
addikt
válasz #90533376 #2843 üzenetére
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
vagy fullba vagy sehogy :D
-
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 -
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.
Rock and stone, to the bone! Leave no dwarf behind!
Új hozzászólás Aktív témák
Állásajánlatok
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest