Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Importovanie premennej v cykle

Aktivity
Avatar
Loter
Člen
Avatar
Loter:1.1.2018 22:06

Mám dva programy a potreboval by som medzi nimi presúvať premennú.

a.py

counter = 1

if __name__ == "__main__":
    while(1):
        counter += 1

b.py

import a

poc = a.counter

Problém je ten, že hodnota poc je stále 1 (ako je zadefinovaná na začiatku) a nie tá meniaca. Možno by pomohla nejaká globálna premenná neviem. Nejaké rady?

Odpovědět
1.1.2018 22:06
Kto vie dobre programovať, nemusí sa pretvarovať :)
Avatar
Martin Petrovaj
Tvůrce
Avatar
Martin Petrovaj:1.1.2018 22:48

V prvom rade, aj keď integery sú (ako všetko) v Pythone objekty, stále sú immutable, takže ak pochádzaš z iného jazyka tak to je podobné, ako keby si ich všade presúval by value. Pokiaľ chceš aby a a b zdieľali nejaké immutable dáta, musíš im ich posunúť v nejakom mutable kontajneri (v tvojom prípade by si mohol vyskúšať presúvať zoznam [counter]).

Ešte by som ale pre úplnosť rád vedel, akým spôsobom tie dva skripty spúšťaš súbežne, if I may ask.

Nahoru Odpovědět
1.1.2018 22:48
if (this.motto == "") { throw new NotImplementedException(); }
Avatar
B42P6
Člen
Avatar
Odpovídá na Loter
B42P6:2.1.2018 0:54

Ty v podstate potrebuješ to čo sa v iných jazykoch volá pointer/referencia.
Myslím si, že je veľmi pravdepodobné, že niečo navrhuješ zle, keď to potrebuješ riešiť takto, prečo nemôžeš použiť v b.py rovno a.counter namiesto poc. :-)

Inak tiež by ma zaujímalo ako to spúštaš súbežne, lebo asi ti to nebude fungovať tak ako by si chcel :-), ale ako tak pozerám budeš asi musieť použiť multithreading.

Nahoru Odpovědět
2.1.2018 0:54
'long long long' is too long for GCC
Avatar
Loter
Člen
Avatar
Loter:2.1.2018 12:24
if __name__ == "__main__":
        p1 = multiprocessing.Process(target=b)

        p1.start()

        while(1):
                pole (premenná pole)

no a ja potrebujem používať v b.py hodnoty v premennej pole

Nahoru Odpovědět
2.1.2018 12:24
Kto vie dobre programovať, nemusí sa pretvarovať :)
Avatar
Loter
Člen
Avatar
Odpovídá na Martin Petrovaj
Loter:2.1.2018 12:27

Toto hore je len príklad. V programe presúvam celé pole, ktoré sa v a.py mení a v b.py potrebujem pracovať s novými dátami.

Nahoru Odpovědět
2.1.2018 12:27
Kto vie dobre programovať, nemusí sa pretvarovať :)
Avatar
Loter
Člen
Avatar
Odpovídá na B42P6
Loter:2.1.2018 12:28

Jediný dôvod je, že premenná poc je kratšia ako a.counter (lenivosť) :D

Editováno 2.1.2018 12:29
Nahoru Odpovědět
2.1.2018 12:28
Kto vie dobre programovať, nemusí sa pretvarovať :)
Avatar
Loter
Člen
Avatar
Loter:2.1.2018 12:32

Konkrétne teraz to riešim takto

if __name__ == "__main__":
        while(1):
                pole+=1

        fh = open("hello.txt", "w")
        fh.write(str(pole))
        fh.close()

a následne v b.py

fh = open("hello.txt", "r")
pole = fh.read()

Neviem prečo ale cítim, že to nieje najlepšie riešenie :D

Nahoru Odpovědět
2.1.2018 12:32
Kto vie dobre programovať, nemusí sa pretvarovať :)
Avatar
gcx11
Tvůrce
Avatar
Odpovídá na Loter
gcx11:2.1.2018 20:56

Ahoj, to první nefunguje proto, že import si spustí kód z a.py, nepřipojuje se to na stávájící program.

Navíc to

if __name__ == "__main__":

se provádí pouze, pokud jsi spustil Python program/skript přes ten soubor, jinak je v tom

__name__

uložená jiná hodnota, která indikuje, že ten soubor voláš přes import.

Můžeš zkusit ještě použít sockety lokálně, nebo použít multiprocessing a dopočítávat ta data na pozadí. Ale můžu radit blbost, když nevím, co takto chceš přesně řešit.

 
Nahoru Odpovědět
2.1.2018 20:56
Avatar
Loter
Člen
Avatar
Loter:3.1.2018 12:31

Našiel som niečo takéto (veľmi sa to nelíši od pôvodného riešenia ale je to jednoduchšie).

a.py

import pickle
import sys

if __name__ == "__main__":
        list = 'bla'
        pickle.dump(list, open( "save.p", "wb" ))

b.py

import pickle
import os

list = pickle.load( open( "save.p", "rb" ) )
print(list)
os.remove(r"save.p")

Neexistuje niečo kde by program ukladal dáta niekde mimo (nevytváral by reálnu zložku ako save.p alebo hello.txt) ale fungovalo by to rovnako ako riešenia predtým?

Editováno 3.1.2018 12:31
Nahoru Odpovědět
3.1.2018 12:31
Kto vie dobre programovať, nemusí sa pretvarovať :)
Avatar
gcx11
Tvůrce
Avatar
Odpovídá na Loter
gcx11:3.1.2018 19:33

Jak jsem psal výše, sockety nebo multiprocessing, ale záleží, co přesně děláš. Posílat si pole mezi programy je samo o sobě dost divné.

 
Nahoru Odpovědět
3.1.2018 19:33
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 10.