• Vítejte na XBMC-Kodi.cz
  • Česko-slovenská komunita fanoušků XBMC/Kodi
Vítejte návštevníku! Přihlášení Registrace


Hodnocení tématu:
  • 0 Hlas(ů) - 0 Průměr
  • 1
  • 2
  • 3
  • 4
  • 5
Skrytí příkazového řádku v Kodi (Windows)
#1
@JiRo: Použitelnost jednoho z mých doplňků jsem chtěl rozšířit i na OS Windows:
 
Kód:
...

if inet_on == "true":
        if system == "Windows":
            response_inet = os.system("ping -n 1 " + inet_ip)
        else:
            response_inet = os.system("ping -c 1 " + inet_ip)

...

Funguje to, ale problém je, že cmd, který je ve Windows volán, je v Kodi (Windows) zobrazován na popředí. Byť je to na zlomek vteřiny, to bliknutí je viditelné a nepříjemné. Existuje způsob, jak tento jev potlačit? Dík
X96max plus 4/32 + CE 21 + skin Confluence SCC / TV Samsung QE55Q6FNA
X96max plus 4/32 + CE 20.5 + skin Confluence SCC

AVR Denon 1600H / Dali Spektor 5.1
Win10pro + Kodi19.5
NAS Synology 215j 3TB Raid1
Router Turris 1.1
 
Citovat
#2
@jkmh Hmm... Asi je to, pokud to použiješ ve scriptu/pluginu, logické. Já to volání systémových příkazů používám pouze v service a odtud se to do gui Windows asi nedostane.

Napadá mě jen jedno. Zkus místo os.system() použít subprocess.Popen().

Nějak takto:
 
Kód:
import subprocess
.
.
.
...subprocess.Popen("ping -n 1 " + inet_ip, stdout=subprocess.PIPE, shell=True).stdout.read().rstrip())

Já už používám jen toto řešení. Kromě jiného u něj nejsou problémy se správou paměti. Některé knihovní implementace os.system mají nebo měly (údajně) problém, v jehož důsledku mohlo dojít k postupnému vyčerpávání operační paměti.
 
Citovat
#3
@JiRo: Dík za reakci. Používám to v service.ping.monitor. Než jsi reagoval, zkusil jsem 
 
Kód:
...
response_inet = subprocess.call(['ping', '-n', '1', inet_ip])
...
ale výsledek byl stejný. Zkusím ještě tvůj návrh.
X96max plus 4/32 + CE 21 + skin Confluence SCC / TV Samsung QE55Q6FNA
X96max plus 4/32 + CE 20.5 + skin Confluence SCC

AVR Denon 1600H / Dali Spektor 5.1
Win10pro + Kodi19.5
NAS Synology 215j 3TB Raid1
Router Turris 1.1
 
Citovat
#4
@jkmh Bacha, byla tam chyba, v řetězci příkazu chyběly úvodní uvozovky. 8 Ale toho sis snad všiml... Už jsem to opravil.
 
Citovat
#5
@JiRo: Všiml, hned. Počet závorek mi nějak neseděl. Také jsem na konec ještě přidal  .decode() 6 Ale takto to není použitelné. Pro :
Kód:
...
if response_inet == 0:
...
Potřebuji jen výsledek 0/1 Tvůj návrh pošle standardní "Windows"výpis.  Jen je s mým doplněním učesanější. 8
X96max plus 4/32 + CE 21 + skin Confluence SCC / TV Samsung QE55Q6FNA
X96max plus 4/32 + CE 20.5 + skin Confluence SCC

AVR Denon 1600H / Dali Spektor 5.1
Win10pro + Kodi19.5
NAS Synology 215j 3TB Raid1
Router Turris 1.1
 
Citovat
#6
@jkmh No jo, to mě hned nenapadlo... 11 Popřemýšlím ještě...

Já už ty "ping-y" v Kodi neřeším, takže to nemám zmáknuté. Ale zkus se podívat sem a nebo sem. Tam je to poměrně dobře rozebrané.
 
Citovat
#7
@JiRo: Nemusíš. Poradila AI.
 
Kód:
...
if "TTL=" in response_inet:
            inet_status = str(0)
...

Nicméně projev se nezměnil.  8

Asi s ní začnu častěji kamarádit.  6
X96max plus 4/32 + CE 21 + skin Confluence SCC / TV Samsung QE55Q6FNA
X96max plus 4/32 + CE 20.5 + skin Confluence SCC

AVR Denon 1600H / Dali Spektor 5.1
Win10pro + Kodi19.5
NAS Synology 215j 3TB Raid1
Router Turris 1.1
 
Citovat
#8
@jkmh To, že se projev nezměnil je divné. Já subprocess.Popen používám taky pro doplňek speedmeter a teď ho zrovna upravuji pro běh ve Windows a nic takového, co popisuješ ty, se mi tam neděje. A to volám příkaz každých 5 sekund, takže bych si toho určitě všiml. Ale možná to souvisí s typem příkazu.
 
Citovat
#9
Linky si projdu, ale začínám být k tomu skeptický.

@JiRo: Je možné, že za ten projev může NB stařeček a že u tebe to jen není vidět?
X96max plus 4/32 + CE 21 + skin Confluence SCC / TV Samsung QE55Q6FNA
X96max plus 4/32 + CE 20.5 + skin Confluence SCC

AVR Denon 1600H / Dali Spektor 5.1
Win10pro + Kodi19.5
NAS Synology 215j 3TB Raid1
Router Turris 1.1
 
Citovat
#10
@jkmh A co ti vlastně při tom problikne, comand line okno? Možná to pak závisí i na tom, jak máš nastvené zobrazení. V okně nebo na celou obrazovku. A když na celou obrazovku, máš zapnuté nebo vypnuté - Použít okno na celou obrazovku? Zkoušel jsem všechny kombinace nastavení u sebe, ale ani v jednom případě se mi tam nic nezobrazuje. Ještě zkusím do té service vložit ping a uvidím...

A ještě dotaz, co ti problikne. To volání příkazu ping..., jeho výsledek nebo obojí? Napadlo mě zkusit do příkazu vložit přesměrování výstupu výsledku do prázdna, ve Windows by to snad mělo být "> nul"

Tak jsem do běžící service ve Windows přihodil volání ping pomocí subprocess.Popen. Mám na to funkci:
Kód:
def systemCommand(command):
    return subprocess.Popen(command, stdout=subprocess.PIPE, shell=True).stdout.read().rstrip()
tu volám ve smyčce po 5 vteřinách:
Kód:
logNot('Ping: {}'.format(systemCommand('ping -n 1 10.0.0.10')))
v logu pak je vidět toto:
Kód:
2023-06-12 12:13:42.208 T:19812    info <general>: [Speed Meter] Ping: b'\r\nPinging 10.0.0.10 with 32 bytes of data:\r\nReply from 10.0.0.10: bytes=32 time<1ms TTL=64\r\n\r\nPing statistics for 10.0.0.10:\r\n    Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),\r\nApproximate round trip times in milli-seconds:\r\n    Minimum = 0ms, Maximum = 0ms, Average = 0ms'
2023-06-12 12:13:47.672 T:19812    info <general>: [Speed Meter] Ping: b'\r\nPinging 10.0.0.10 with 32 bytes of data:\r\nReply from 10.0.0.10: bytes=32 time=1ms TTL=64\r\n\r\nPing statistics for 10.0.0.10:\r\n    Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),\r\nApproximate round trip times in milli-seconds:\r\n    Minimum = 1ms, Maximum = 1ms, Average = 1ms'
2023-06-12 12:13:52.166 T:19812    info <general>: [Speed Meter] Ping: b'\r\nPinging 10.0.0.10 with 32 bytes of data:\r\nReply from 10.0.0.10: bytes=32 time<1ms TTL=64\r\n\r\nPing statistics for 10.0.0.10:\r\n    Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),\r\nApproximate round trip times in milli-seconds:\r\n    Minimum = 0ms, Maximum = 0ms, Average = 0ms'
2023-06-12 12:13:57.498 T:19812    info <general>: [Speed Meter] Ping: b'\r\nPinging 10.0.0.10 with 32 bytes of data:\r\nReply from 10.0.0.10: bytes=32 time=1ms TTL=64\r\n\r\nPing statistics for 10.0.0.10:\r\n    Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),\r\nApproximate round trip times in milli-seconds:\r\n    Minimum = 1ms, Maximum = 1ms, Average = 1ms'
ale nikde ve Windows se mi nic dalšího nezobrazuje ani neproblikává.

Ještě tedy zkusím doplnit do té první funkce vyhodnocení exit code...
 
Citovat
#11
@JiRo: Ano, problikne command line okno. V nastavení mám Na celou obrazovku a zapnuté Použít okno na celou obrazovku. Pokud Použít okno na celou obrazovku zakážu, je to ještě horší.

To probliknutí je krátké. Ale natolik dlouhé, že pokud jsem připraven a na to okno kliknu, zůstane na popředí a je viděl stejný výsledek jako v standardním command line oknu ve Windows. Zkrátka je to command line okno Windows se vším všudy.

@JiRo: Jsi rychlejší než já. Bavíme se o spuštěném Kodi ve Windows. Dal bych sem celý service addon, ale ostatní, kteří si to případně stáhnou se mohou dostat do potíží. A pak bude "A proč..."
X96max plus 4/32 + CE 21 + skin Confluence SCC / TV Samsung QE55Q6FNA
X96max plus 4/32 + CE 20.5 + skin Confluence SCC

AVR Denon 1600H / Dali Spektor 5.1
Win10pro + Kodi19.5
NAS Synology 215j 3TB Raid1
Router Turris 1.1
 
Citovat
#12
@jkmh Ještě by to mohlo souviset s dobou vykonání příkazu, rep. s dobou odpovědi na ping. Já adresuji IP v LAN a odpověď se pohybuje v nízkých jednotkách ms. Což může být podobné tvé hypotéze o stařičkém NB... Zkusím taky adresovat něco, kde je respons time na ping delší, nebo dokonce neexistující adresu, kde by měl proběhnout celý timeout ping-u.

Pinkám na neexistující adresu, mezi vysláním povelu a odpovědí projde cca 3-4 vteřiny a přesto žádné probliknutí okna stále nevidím.
 
Kód:
2023-06-12 12:33:27.104 T:8416     info <general>: [Speed Meter] Send command ping
2023-06-12 12:33:30.061 T:8416     info <general>: [Speed Meter] Ping: b'\r\nPinging 10.0.0.100 with 32 bytes of data:\r\nReply from 10.0.0.11: Destination host unreachable.\r\n\r\nPing statistics for 10.0.0.100:\r\n    Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),'
Fakt divné. Tady jsem asi v koncích. Windows tak dobře neznám, abych to dokázal vysvětlit. Takže tentokrát ti asi nepomohu.

A co verze? Já mám W10...
 
Citovat
#13
Příspěvek smazán
X96max plus 4/32 + CE 21 + skin Confluence SCC / TV Samsung QE55Q6FNA
X96max plus 4/32 + CE 20.5 + skin Confluence SCC

AVR Denon 1600H / Dali Spektor 5.1
Win10pro + Kodi19.5
NAS Synology 215j 3TB Raid1
Router Turris 1.1
 
Citovat
#14
@jkmh Aha, tak už je zřejmé, kde je zakopaný pes.

To, co jsi napsal, není Kodi service v pravém slova smyslu. Měl by sis to, jak taková service má vypadat, nastudovat. V addons, co jsou v Kodi, je příkladů dost.

Za mě je třeba základní struktura service dobře vidět ve script.conetxtmenu. I když tady je to hodně netypické, protože z celého principu funkce service je tam využíváno pouze asymchronní zachycení změny v nastavení addon (viz procedura getSettings()), které se v ní přepíše pro proměnných properties, které jsou využity v addon.xml. Ostatní je jen nutná omáčka, aby to jako service fungovalo. Žádnou jinou funkci tam ta service nemá. Ale jako začátek pro to, aby ta tvá service fungovala opravdu jako service, je to podle mne dost ilustrativní.

Já teď nemám času se tomu věnovat, jsem na odchodu a návrat dnes určitě neplánuji, možná zítra/pozítří, to nezáleží na mně. Na netu asi chvílemi budu, ale jen přes mobil, a navíc moc prostoru mít nebudu.
 
Citovat
#15
@JiRo: Nevadí. Taky odjíždím. Mám tu přílohu raději smazat? Už dříve jsem ti napsal, že nejsem programátor. Jisté zkušenosti mám z průmyslové automatizace (Siemens Simatic). Python se učím z příkladů a za pochodu.
X96max plus 4/32 + CE 21 + skin Confluence SCC / TV Samsung QE55Q6FNA
X96max plus 4/32 + CE 20.5 + skin Confluence SCC

AVR Denon 1600H / Dali Spektor 5.1
Win10pro + Kodi19.5
NAS Synology 215j 3TB Raid1
Router Turris 1.1
 
Citovat
#16
@jkmh Asi ano.
 
Citovat
#17
@JiRo: Jakékoliv řešení s použitím subprocess se chovalo stejně špatně. Vyjma použití podmínky creationflags=0x08000000, která potlačuje okno cmd. To se chovalo správně. Nakonec jsem na radu dcery použil socket. To mimo jiné odstranilo nutnost řešit rozdílné platformy. Doufám, že je to schůdné řešení i z hlediska service. Tvůj názor? Dík.

Rizika, že port 80 nemusí být dostupný a tím pádem může poslat špatný výsledek, jsem si vědom.


Přiložené soubory
.zip   service.ping.monitor.zip (Velikost: 16,38 KB / Stažení: 3)
X96max plus 4/32 + CE 21 + skin Confluence SCC / TV Samsung QE55Q6FNA
X96max plus 4/32 + CE 20.5 + skin Confluence SCC

AVR Denon 1600H / Dali Spektor 5.1
Win10pro + Kodi19.5
NAS Synology 215j 3TB Raid1
Router Turris 1.1
 
Citovat
#18
@JiRo: Tak ta service určitě podle pravidel a dokonalá není, ale pro takový jednoduchý případ a pokud to funguje, tak proč ne.

Použití socketu je určitě dobrý nápad. Jen si nejsem jistý, zda to z hediska spotřeby paměti nebude mít nějaký negativní dopad. Myslím tím, zda to opakované použití socket.create_connection pokaždé neukrojí kus paměti. Ale na to mé znalosti pythonu a obecně síťových operací tohoto typu nestačí. Ale snad ne. Každopádně sleduj obsazení paměti, zda se nebude vyčerpávat.
 
Citovat
#19
@JiRo: Díky za reakci. Budu to sledovat. Co se týče service, pak jsem to zřejmě nepochopil správně. Projížděl jsem addony v CE. Skladba service se u nich liší. Alespoň z mého pohledu laika. Pro můj důchodcovský mozek asi potřebuji k pochopení hodně jednoduchý příklad.
X96max plus 4/32 + CE 21 + skin Confluence SCC / TV Samsung QE55Q6FNA
X96max plus 4/32 + CE 20.5 + skin Confluence SCC

AVR Denon 1600H / Dali Spektor 5.1
Win10pro + Kodi19.5
NAS Synology 215j 3TB Raid1
Router Turris 1.1
 
Citovat
  


Přejít na fórum:


Prochází: 1 host(ů)