Portál AbcLinuxu, 14. května 2025 00:00

Dotaz: Python a volání fci mezi moduly

2.7.2007 11:17 pepik | skóre: 16 | blog: nevim | Chlumec nad Cidlinou
Python a volání fci mezi moduly
Přečteno: 388×
Odpovědět | Admin
Jelikož se teprve učím python, nejsem si jistý, jestli mé postupy jsou správné a proto se ptám. Dejme tomu, že mám hlavní soubor do kterého importuju 2 moduly. Tyto moduly obsahují fce. Zjistil jsem, že fci, která je v jednom modulu nemůžu volat z modulu druhého. Také z modulu se mě nedaří přistupovat k objektům z hlavního souboru. Zkoušel jsem moduly importovat přez "import modul" i "from modul import *" a výsledek vždy stejný. Tuto situaci jsem prozatím vyřešil tak, že moduly spouštím přímo pomocí execfile(), ale to nebude asi správný postup. Př:
hlavní soubor:
import modul

def fce():
  print "ok"

modul:
fce() // neprovede se
Je tedy možné přistupovat z modulů k hlavnímu souboru?
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

kozzi avatar 2.7.2007 11:28 kozzi | skóre: 55 | blog: vse_o_vsem | Pacman (Bratrušov)
Rozbalit Rozbalit vše Re: Python a volání fci mezi moduly
Odpovědět | | Sbalit | Link | Blokovat | Admin
Je tedy možné přistupovat z modulů k hlavnímu souboru?
IMHO asi ne. Ono moduly by měli obsahovat určité fumkce, které plánuješ používat ve více souborech a prpto jsou umístěny jako modul. Takže by čistě teoreticky moduly něměli přistupovat k hlavnímu souboru, ale hlavní soubor by měl vše propojovat. Takže hlavní soubor bude využívat funkce z různých modulů a ne naopak. Takže pokud modul obsahuje funkci, která by měla chtít přistupovat do hlavního souboru, tak je to špatně navržený, a ta funkce by měla být přímo v tom hlavním souboru.
Linux je jako mušketýři "jeden za všechny, všichni za jednoho"
2.7.2007 11:37 pepik | skóre: 16 | blog: nevim | Chlumec nad Cidlinou
Rozbalit Rozbalit vše Re: Python a volání fci mezi moduly
Takže když mám v hlavním souboru napsané GUI a v modulu mám fci, která něco časově náročného provádí a chci průběh té fce zobrazovat v GUI pomocí progressbaru tak musím tu funkci vložit do hlavního souboru? Kdyby aspoň funkce uměly vracet hodnoty nějak průběžne, tak bych věděl :-D
2.7.2007 13:16 podlesh | skóre: 38 | Freiburg im Breisgau
Rozbalit Rozbalit vše Re: Python a volání fci mezi moduly
Takže když mám v hlavním souboru napsané GUI a v modulu mám fci, která něco časově náročného provádí a chci průběh té fce zobrazovat v GUI pomocí progressbaru tak musím tu funkci vložit do hlavního souboru? Kdyby aspoň funkce uměly vracet hodnoty nějak průběžne, tak bych věděl :-D
Zrovny v pythonu umí (yield).

Každopádně, toto se vždy (nezávisle na jazyce) řeší pomocí callbacku.

Obecně platí: pokud potřebuješ takovéto zpřeházení závislostí, tak to máš špatně navržené.
2.7.2007 13:39 pepik | skóre: 16 | blog: nevim | Chlumec nad Cidlinou
Rozbalit Rozbalit vše Re: Python a volání fci mezi moduly
Teď jsem si našel něco o yieldu a zdá se, že vyřeší můj problém s těmi moduly. Dík za info
2.7.2007 11:40 HH
Rozbalit Rozbalit vše Re: Python a volání fci mezi moduly
Odpovědět | | Sbalit | Link | Blokovat | Admin
Napr.: Pokud fce() z modul_1 vola fce() z modul_2, musi modul_1 obsahovat
import modul_2.
Hlavni soubor bude obsahovat
import modul_1.
Potom hlavni soubor muze volat fce, promene atd z modul_1 i modul_2
2.7.2007 11:47 pepik | skóre: 16 | blog: nevim | Chlumec nad Cidlinou
Rozbalit Rozbalit vše Re: Python a volání fci mezi moduly
A kdybych náhodou potřeboval volat funkce z jednoho modulu v druhém a naopak, tak mám smůlu a musím můj program navrhnout jinak?
Pavel Stárek avatar 2.7.2007 11:59 Pavel Stárek | skóre: 44 | blog: Tady bloguju já :-) | Kolín
Rozbalit Rozbalit vše Re: Python a volání fci mezi moduly
Odpovědět | | Sbalit | Link | Blokovat | Admin
Hmm, mělo by fungovat asi toto:

modul1:
import modul2
def fcemodulu1:
  print "Ja sem modul 1!"
# tady a takhle se zavola funkce z modulu 2
modul2.fcemodulu2()
modul2:
import modul1
def fcemodulu2:
  print "Ja sem modul 2!"
# tady a takhle se zavola funkce z modulu 1
modul1.fcemodulu1()
Zrovna tak jde z "podřízených" modulů volat funkce z "hlavního" modulu. Pokud se hlavní modul jmenuje hlavnimodul a v něm bude nějaká funkce, tak můžu v "podřízeném" modulu provést:
import hlavnimodul
hlavnimodul.fce()
Kdo chce, hledá způsob; kdo nechce, hledá důvod.
kozzi avatar 2.7.2007 12:37 kozzi | skóre: 55 | blog: vse_o_vsem | Pacman (Bratrušov)
Rozbalit Rozbalit vše Re: Python a volání fci mezi moduly
No s pythonem uz chvili nedelam ale mam pocit, ze takto to presne nejde, protoze python kdyz zacne importovat jeden modul, tak nez ho importuje tak importuje zavislosti toho importovvanyho modulu, a jelikoz jedna ze zavislosti by byla volajici modul, tak by to asi neslo.
Linux je jako mušketýři "jeden za všechny, všichni za jednoho"
Pavel Stárek avatar 2.7.2007 12:49 Pavel Stárek | skóre: 44 | blog: Tady bloguju já :-) | Kolín
Rozbalit Rozbalit vše Re: Python a volání fci mezi moduly
Má pravdu, předsedo :-) Teď sem si to vyzkoušel v debuggeru odkrokovat a opravdu to takhle nejde, což mě tedy "příjemně" překvapilo. Takže odvolávám, co jsem napsal, měl jsem si to nejprve vyzkoušet, sypu si popel na hlavu.
Kdo chce, hledá způsob; kdo nechce, hledá důvod.
2.7.2007 13:34 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: Python a volání fci mezi moduly
Odpovědět | | Sbalit | Link | Blokovat | Admin
Dá se udělat třeba tohle:
Hlavní program:
#!/usr/bin/env python
def funkce(x):
    return x + 1

import modul
modul.callfunc(funkce, 5)
Modul:
#!/usr/bin/env python
def callfunc(func, x):
    print func(x)
Jestliže děláš nějaké numerické výpočty, tak se koukni na moduly scipy a numpy. Tam jsou callbacky celkem běžnou záležitostí.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.