Avatar billede tangveje Nybegynder
14. november 2008 - 19:05 Der er 6 kommentarer og
1 løsning

Python: Adgang til variable/funktioner mellem subprocesses

Hej. Jeg har følgende to små python scripts

Ali.py :
--------

import os, subprocess, Tkinter

def spawn( ):
    proc = subprocess.Popen( 'python d:\\python\\ali\\cell.py' )

    cells.append( proc )

if __name__ == '__main__':
    cells = []

    os.putenv( 'Ali.pid', str( os.getpid( ) ) )

    root = Tkinter.Tk( )

    root.title( 'Ali' ) ;
    root.geometry( '230x40+200+200' )
    root.resizable( 0, 0 )

    Tkinter.Button( root, text='Spawn', width=7, command=spawn ).grid( column=3, row=0, pady=8, padx=12 )

    root.mainloop( )




cell.py :
---------

import os

if __name__ == '__main__':
    pid = os.getpid( )
    parid = os.getenv( 'Ali.pid' )

    print pid, parid


Grundideen er at ali.py starter et antal af cell.py som subprocesser. Den del virker ganske fint. Problemet er at jeg ønsker at alle de forskellige processer skal kunne kommunikere direkte med hinanden. Det vil sige at hvis jeg har ali.py og et antal subprocesser så skal én subprocess kunne kommunikere direkte med en hvilken som helst anden subprocess, helst uden at skulle gå igennem ali.py først.

Jeg tænkte den mest naturlige måde at gøre dette på var ved at gøre 'cells' arrayet i ali.py globalt, sådan at alle subprocesser kan tilgå det frit. Jeg kan dog ikke finde noget som helst om dette i dokumentationen. Er det muligt?

Alternativt tænkte jeg at de forskellige subprocesser måske kunne tilgå ali.py og dennes variable/funktioner gennem dens pid på en eller anden måde, hvilket er grunden til at ali.py pt. sætter en environment variabel med sit pid. Jeg har dog heller ikke kunnet finde nogen måde at bruge det til noget konstruktivt.
Avatar billede arne_v Ekspert
14. november 2008 - 19:08 #1
Det er ikke muligt, da det er forskellige processer.

Naar du har forskellige processer skal du igang med at kigge paa sockets, shared memory
og andre inter process communication metoder.
Avatar billede arne_v Ekspert
14. november 2008 - 19:08 #2
Alternativt skal du skifte fra processer til traade.
Avatar billede tangveje Nybegynder
14. november 2008 - 19:14 #3
Ærgeligt

Jeg har kigget på både 'threading' og 'multiprocessing' modulerne, men umidelbart kan de ikke åbne eksterne scripts, men kun køre interne funktioner. Eller har jeg misforstået noget der?
Avatar billede arne_v Ekspert
14. november 2008 - 19:19 #4
Du kan ikke koere nye EXE (python.exe) i en traad. Men du kan koere Python kode
i en traad - ogsaa selvom koden ligger i en ekstern fil. Ja - jeg har aldrig
proevet, men jeg ar alligevel stensikker paa at man kan !
Avatar billede arne_v Ekspert
15. november 2008 - 04:59 #5
Her kommer hello world i moduler, tråde og shared data.

main.py
-------

import data
from setthr import setthr
from prtthr import prtthr

t1 = setthr()
t1.start()
t1.join()
t2 = prtthr()
t2.start()
t2.join()

data.py
-------

x = 0

setthr.py
---------

import threading

import data

class setthr(threading.Thread):
    def run(self):
        data.x = 123

prtthr.py
---------

import threading

import data

class prtthr(threading.Thread):
    def run(self):
        print data.x
Avatar billede tangveje Nybegynder
15. november 2008 - 13:11 #6
Ha, det virker. Havde aldrig tænkt på at gemme data i en seperat fil, måske derfor det ikke gad virke i aftes da jeg sad og kæmpede med det.

Mange tak for hjælpen. Lægger du et svar?
Avatar billede arne_v Ekspert
15. november 2008 - 14:47 #7
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester