Python programozás - Szoftverfejlesztés fórum

üzenetek

hozzászólások


axioma
(veterán)

ha ez a logika (kodot nem neztem), akkor a masodik korben is lehet a vizsgalat es kikapcsolhatja a zoldet akkor is, ha be volt ugyan kapcsolva de talal hozza tartozo pirosat a powered pins-ben - igy nem kell harmadik kor, sorrendtol teljesen fuggetlenul mukodne


kovisoft
(őstag)

Ez villogást (vagy ha nem lámpáról lenne szó, akkor egyéb mellékhatást) okozhatna, valószínűleg az sem véletlen, hogy nem azt csinálja a program, hogy először mindent kikapcsol, aztán bekapcsolja azokat, amiket be kell. De persze, ha ez nem zavaró, akkor úgy is lehet csinálni, ahogy írod.


axioma
(veterán)

Hm, jogos, latszik h csak a logikai vegeredmenyt neztem :) nem vagyok hardverhez szokva...
Akkor is megoldhato kettoben: elsore nem kapcsol csak gyujti, masodikban meg kapcsol mind2 iranyban, csak a zold kivant allapotat update-eli a set-beli allapothoz kepest a muvelet elott.

[ Szerkesztve ]


cigam
(félisten)
Blog

A példa kedvéért tegyül fel, hogy az 1,3,5,7 lábak vezérlik a piros lámpákat, a 2,4,6,8 pedig a zöldeket. Az első csatornához tartozik a 1,2, a második csatornához a 3,4,...
# Ha az első piros lámpa bekapcsolódik
if pinNUmber = 1:
# Kikapcsolja a hozzá tartozó zöldet
powered_pins.remove(2)
powered_pins.append(gpo["pinNumber"])
Ha a piros lámpát bekapcsolja, a hozzá tartozó zöld lámpa sorszámát kiveszi a powered_pins listából, így a következő ciklusban kikapcsolja a hozzá tartozó zöldet. (Nem fut hibára, ha egy nem létező elemet vennék ki?) Viszont semmi nem garantálja, hogy a piros lámpa után, a rákövetkező ciklusban nem a csatornához tartozó zöld lámpát olvassa be, ami visszakapcsolhatja.
Ezért az ellenörzést, kikapcsolást, inkább a két ciklus közé kellene tenni, amikor már minden bekapcsolt relét tartalmazó lista elkészült.
# Ha a az első piros lámpa bekapcsolódik
if 1 in powered_pins:
  # Kikapcsolja a hozzá tartozó zöldet
 powered_pins.remove(4)
Vagy be lehet passzítani valahogy az első listába, amikor a powered_pins készül?

Megoldható, hogy ne legyen beégetve a IO láb sorszáma, hanem a .json fájlból beolvasott értékekkel hivatkozzak rá?

[ Szerkesztve ]


kovisoft
(őstag)

Az if-ben dupla == az egyenlőségvizsgálat.

A json konfig mintában azt látom, hogy csak deviceId-k és azon belül pinNumber-ök vannak definiálva, ezzel a konfiggal leginkább csak hardkódolni tudod. De ha kiegészítheted a konfigot, akkor felvehetsz plusz attribútumokat, amikkel megadhatod, hogy az adott device vagy az adott device adott pin-je milyen másik device milyen pin-jével nem működhet együtt. Pl. a "pinNumber" mellé felvehetsz egy "conflictingDeviceId" és egy "conflictingPinNumber" mezőt. Ide beírod, hogy mivel nem tud együtt működni. A kódban pedig gpo["conflictingPinNumber"]-ként tudsz rá hivatkozni.


cigam
(félisten)
Blog

Köszi a kiigazítást! Most hogy már van valami elképzelés, holnap neki is állok a tesztelésnek.

[ Szerkesztve ]


cigam
(félisten)
Blog

A két ciklus közé kellett ez a pár sor, és most úgy működik, ahogy szeretném.
        # Ha a ch1 piros, kikapcsolja a ch1 zöldet
        if 14 in powered_pins and 16 in powered_pins:
           powered_pins.remove(16)
        # Ha a ch2 piros, kikapcsolja a ch2 zöldet
        if  4 in powered_pins and 26 in powered_pins:
           powered_pins.remove(26)
        # Ha a ch3 piros, kikapcsolja a ch3 zöldet
        if  3 in powered_pins and 20 in powered_pins:
           powered_pins.remove(20)
        # Ha a ch4 piros, kikapcsolja a ch4 zöldet
        if  2 in powered_pins and 21 in powered_pins:
           powered_pins.remove(21)

Köszönöm a segítséget, útba igazítást!


Blasius
(tag)

Sziasztok,

Egy egyszerű kódot szeretnék futtatni microPythonban egy openWRT routeren:

import socket
soc = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
soc.bind(('', 2215))

De már a harmadik sorban elakadtam, és ezt a hibaüzenetet kapom:
TypeError: object with buffer protocol required

Ugyanaz a hibaüzenet a routeren is és egy linuxos gépen is. Rendes pythonban jól megy.
Mi lehet a probléma a microPythonban?


Blasius
(tag)

Köszönöm, így már értem mi történt itt :R


Hege1234
(addikt)

sziasztok!

szeretném megoldani, hogy ha nem lett bejelölve a python win installálásnál az add to path
akkor futtatva a script-et, hozzáadja a PATH-hoz, és akkor nem kell újrainstallálni vagy manuálisan szórakozni vele..

mivel minden ilyen módosításhoz admin jog kell, lehetséges lenne ezt python alól megoldani?

ilyesmivel próbálkozok, de mivel nem ad ki írási hibát így gondolom még csak meg se próbálja hozzáadni

import os

spec_python_ver = input('add python dir: (eg.: Python39) write here: ')

scripts_dir = os.path.join(os.environ['LOCALAPPDATA'], f'Programs\\Python\\{spec_python_ver}\\Scripts\\')
python_dir = os.path.join(os.environ['LOCALAPPDATA'], f'Programs\\Python\\{spec_python_ver}\\')

dirs_to_add = [scripts_dir, python_dir]
for directory in dirs_to_add:
if directory not in os.environ['PATH']:
os.environ['PATH'] += os.pathsep + directory
print(f"'{directory}' added to PATH")
else:
print(f"'{directory}' already in PATH")

print("\nUpdated PATH:")
print(os.environ['PATH'])

[ Szerkesztve ]


sh4d0w
(nagyúr)
Blog

Kornyezeti valtozokat dictionary-kent kell kezelni Python alatt, tehat az ertek, amit be akarsz allitani, string kell, hogy legyen.

Viszont amihez admin jog kell - eleg rohejes lenne, ha egy ilyen egyszeru scripttel meg tudnad kerulni - azt vagy adminkent inditod, vagy UAC promptot kapsz.


sztanozs
(veterán)
Blog

User Path valtozohoz nem kell admin jog. Miert nem adod hozza kezzel (vagy CMD fajllal)?
Ha nincs python a path-on, akkor hogy futtatod ezt a python fajlt?

[ Szerkesztve ]


Hege1234
(addikt)

Ha nincs python a path-on, akkor hogy futtatod ezt a python fajlt?

hát erre valóban nem gondoltam, így hogy nálam az már hozzá van adva a path-hoz :B

és akkor egy cmd-vel vagy inkább egy .bat fájlt használva megoldható lenne?

@echo off

set /p spec_python_ver=add python dir: (eg.: Python39) write here:

set "scripts_dir=%LOCALAPPDATA%\Programs\Python\%spec_python_ver%\Scripts\"
set "python_dir=%LOCALAPPDATA%\Programs\Python\%spec_python_ver%\"

echo scripts_dir: %scripts_dir%
echo python_dir: %python_dir%

így az útvonalat megkapom, de batch-el mivel tudom hozzáadni közvetlenül a PATH-hoz?


sztanozs
(veterán)
Blog

setx + kozvetlen registry mokolas:
@echo off
WHERE /q python.exe
IF ERRORLEVEL 1 (
set /p spec_python_ver=add python dir: (eg.: Python39) write here:
set "scripts_dir=%LOCALAPPDATA%\Programs\Python\%spec_python_ver%\Scripts\"
set "python_dir=%LOCALAPPDATA%\Programs\Python\%spec_python_ver%\"
for /f "usebackq tokens=2,*" %A in (`reg query HKCU\Environment /v PATH`) do set
userPATH=%B
setx PATH "%userPATH%;%scripts_dir%;%python_dir%"
)

[ Szerkesztve ]


sztanozs
(veterán)
Blog

Es a rendszerben (szokott helyen) talahato python installaciok listazasa:
WHERE /R %LOCALAPPDATA% python.exe


Hege1234
(addikt)

nálam a script csak ezt adja ki:
write was unexpected at this time.


sztanozs
(veterán)
Blog

mert ezt
add python dir: (eg.: Python39) write here:
be kell helyettesiteni, pl:
Python39


Hege1234
(addikt)

okés be is írtam a scriptbe
Python38

így most már kilistázza mik az elérhető python exe-k, de a python-t beírva
nem ismeri fel a python 3.8.5-öt
csak a py-vel működik ami a Python 3.12.2-es verziót hozza be


sztanozs
(veterán)
Blog

Ez az elsot felveszi es belerakja a path-ba:
@ECHO off
setlocal EnableDelayedExpansion
WHERE /q python.exe
IF ERRORLEVEL 1 (
WHERE /q /R %LOCALAPPDATA% python.exe
IF ERRORLEVEL 1 (
ECHO Nincs installalt python a APPDATA LOCAL-ban!
EXIT /b -1
) ELSE (
ECHO Van installalt python a APPDATA LOCAL-ban!
)
CALL :sub
set "scripts_dir=!py_path!Scripts\"
set "python_dir=!py_path!"
for /f "usebackq tokens=2,*" %%A in (`reg query HKCU\Environment /v PATH`) do set userPATH=%%B
ECHO "!userPATH!;!scripts_dir!;!python_dir!"
setx PATH "%userPATH%;%scripts_dir%;%python_dir%"
)
GOTO :eof

:sub
FOR /f "tokens=*" %%A IN ('WHERE /R %LOCALAPPDATA% python.exe') do (
REM ECHO %%A
SET "py_path=%%~dpA"
EXIT /b
)
GOTO :eof

[ Szerkesztve ]


sztanozs
(veterán)
Blog

Masreszt, ahhoz, hogy a path env valtozas eletbe lepjen ujra kell inditani a command line-t.


Hege1234
(addikt)

köszi!

azt már sikerült elérni, hogy amik ott úgy nagyon hosszan egy sorban vannak
oda "beleírja"
ahogy itt van a képen:
[kép1]
viszont valami miatt nálam ez így nem elég hozzá :F

csak, ha így van manuálisan új sorokba írva:
[kép2]
(amúgy script-el lehetne új sorba írni?)

és úgy akkor már működik:
[kép3]


sztanozs
(veterán)
Blog

Nekem ott alapbol minden uj sorban van. Kezzel irtad azt oda be?


Hege1234
(addikt)

nem én írtam egy sorba, és fura is volt így ömlesztve látni

viszont nem gondoltam, hogy problémát okozhatna mert
kb. minden powershell-es line-ba amit találtam a PATH-hoz az elválasztás az ez volt hozzá ;

$env:Path -split ';'

( ha új sorba van írva akkor nem si kerül a végére a ; )

üzenetek