Gå til innhold

[Python] __import__ problematikk


Anbefalte innlegg

Hesann. Lager et enkelt program i python som skal importere og kjøre scriptene mine, etter jeg har redigert scriptet, og forsøker å kjøre scriptet IGJEN så bruker den ikke oppdaterte kode.. Noen som ser en bedre/annen fremgangsmåte? Tenker meg at den bare kjører filen som er blitt kompilert/.pyc-filen fra første "run"?

 

PS: Har ikke jobbet med denne lenge, så det er stort sett bare "run", og tilhørende textfelt (valg av fil) som fungerer.

Krav er WxPython, og et script plasert i mappen som blir spesifisert, om du skal "teste" deg frem.

 

Delkode:

    def Run(self,event):
       Exec = self.ExecI.GetValue()   
       Wind = self.WindI.GetValue() #ikke implementert, tilhører macrosaker. 
       if(Exec!="" or Exec!=0):
           try:
               macro = __import__(Exec)  
               macro._run()
           except ImportError:
               print "Unable to import file %s.py" % (Exec)

 

Hele kildekoden:

 

#!/usr/bin/python
# -*- coding: utf-8 -*-
'''
MacPy skal bli en enkel GPL macroengine for python, fuksjoner som finnes er
bare grunleggende: Musebevegelser, fargenavigasjon, arbeidsvindu.
En del halvferdige saker uten om dette. Inkluderes seperat i macroen.
'''
#from time import sleep as wait
#re,subprocess
#import wx.lib.buttons as buttons
import wx,sys

sys.path.append("Bots/") #mappen filen ligger i.

class MacPy(wx.Frame):
   def __init__(self, parent,id):
       wx.Frame.__init__(self, parent, id, "MacPy - v0.1", size=(540,280))
       self.MakeMenu()
       self.Worker()

   def Worker(self):
       panel = wx.Panel(self)
       panel.SetBackgroundColour('#eeeff2')     
       hbox = wx.BoxSizer(wx.HORIZONTAL)
       fgs = wx.FlexGridSizer(6, 2, 9, 25)

       Exec = wx.StaticText(panel, label="Execute bot - Filename:")
       Wind = wx.StaticText(panel, label="Window: *Empty if not used*")

       self.ExecI = wx.TextCtrl(panel, size=(250,21))
       self.WindI = wx.TextCtrl(panel, size=(250,21))
       Run = wx.Button(panel, label="Run")
       Run.Bind(wx.EVT_BUTTON, self.Run)

       debugbox = wx.StaticBox(panel, label="Debug")
       boxsizer = wx.StaticBoxSizer(debugbox, wx.VERTICAL)

       dbgtext = wx.TextCtrl(panel, style=wx.TE_MULTILINE, size=(540,100))
       boxsizer.Add(dbgtext, flag=wx.EXPAND, border=9)
       fgs.AddMany([(Exec, 1), (self.ExecI, 1), (Wind, 1), (self.WindI, 1), (Run, 1), (boxsizer, 1, wx.EXPAND)])

       fgs.AddGrowableRow(6, 1)
       fgs.AddGrowableCol(1, 1)

       hbox.Add(fgs, proportion=1, flag=wx.ALL|wx.EXPAND, border=8)
       panel.SetSizer(hbox)

   def Run(self,event):
       Exec = self.ExecI.GetValue()   
       Wind = self.WindI.GetValue() 
       if(Exec!="" or Exec!=0):
           try:
               macro = __import__(Exec)  
               macro._run()
           except ImportError:
               print "Unable to import file %s.py" % (Exec)

   def MakeMenu(self):
       status=self.CreateStatusBar()
       menubar=wx.MenuBar()

       file=wx.Menu()
       script=wx.Menu()
       about=wx.Menu()

       file.Append(wx.NewId(), "Open project...","Open a PyMac-project")
       file.Append(wx.NewId(), "Quit","Exit this program")

       about.Append(wx.NewId(), "MacPy","About the MacPy-software")

       script.Append(wx.NewId(), "Run","Run script...")
       script.Append(wx.NewId(), "Pause","Pause script...")
       script.Append(wx.NewId(), "Stop","Stop script...")

       menubar.Append(file, "File")
       menubar.Append(script, "Script")
       menubar.Append(about, "About")

       self.SetMenuBar(menubar)

# Run the program
if __name__ == "__main__":
app = wx.PySimpleApp()
frame = MacPy(parent=None,id=-1)
frame.Show()
#frame.Centre()
app.MainLoop()

 

 

Det kan vel kansje være mulig å slette kompilert fil etter "run", på den måten blir den tvungen til å kompilere igjen?

Endret av warpie
Lenke til kommentar
Videoannonse
Annonse
og forsøker å kjøre scriptet IGJEN så bruker den oppdaterte kode

Regner med at "ikke" skal være med i den setningen

 

>>> help(reload)
Help on built-in function reload in module __builtin__:

reload(...)
   reload(module) -> module

   Reload the module.  The module must have been successfully imported before.

 

Test reload.

def Run(self,event):
       Exec = self.ExecI.GetValue()
       Wind = self.WindI.GetValue()
       if(Exec!="" or Exec!=0):
           try:
               macro = __import__(Exec)
               reload(macro)
               macro.main()
           except ImportError:
               print "Unable to import file %s.py" % (Exec)

Min test fil.

#h.py
def main():
   print 'I am runnig'
   print 'a change 1 2'

if __name__ == '__main__':
   main()

Med dette kan jeg ha GUI kjørende og viss jeg gjør forandinger på h.py og lagrer.

Vil knapp run() få med de nye endringene uten restart av GUI.

Du kan lage en egen reload button for dette.

Endret av SNIPPSAT
Lenke til kommentar

Beklager skrivefeilen. Flott du forstod det uansett :) Tenker dette fungerer, og skal testes ut.

 

Du vet ikke om noen måte for at en gui skal kunne kjøre en loop uten å "låses"? Jeg får opp Not responding så lenge macroen/scriptet kjøres. Mister muligheten for å stoppe programmet, pause, etc...

 

Har googlet på dette, men det var ikke så mye å finne. Litt vanskelig når man ikke helt vet hva man skal søke etter, fant noe om threading, men forstår ikke helt hvordan dette ta's i bruk...

Endret av warpie
Lenke til kommentar

Du vet ikke om noen måte for at en gui skal kunne kjøre en loop uten å "låses"? Jeg får opp Not responding så lenge macroen/scriptet kjøres. Da er poenget med en gui bortkastet.. Mister muligheten for å stoppe programmet, pause, etc...

 

Har googlet på dette, men det var ikke så mye å finne. Litt vanskelig når man ikke helt vet hva man skal søke etter.. :p

 

Jeg tror det her noe å gjøre med at GUI applikasjoner etc er looper som venter på events selv, fikk det forsøkt forklart i #Python @ irc.freenode.net, men forstod ikke noe særlig av det. Kanskje du kan forsøke å spørre der?

Lenke til kommentar
Du vet ikke om noen måte for at en gui skal kunne kjøre en loop uten å "låses"?

Det er stort sett 2 grunner til dette.

Man kjører med IDE i bakgrunnen dette kan være python sitt default eller eget IDE man bruker.

En løsning er og kjøre koden fra command line.

 

For windows bruker Pyscripter i dette IDE kan man kjøre noe som heter remote wx.

Dette gjør at GUI ikke låser seg.

 

Den andre grunnen til lås av GUI er at man kjører en prosess som tar litt tid.

Dette kan da løses med Threading eller multiprocessing

 

Mike Driscol har en bra post om threading i wxpython her.

http://www.blog.pythonlibrary.org/2010/05/22/wxpython-and-threads/

 

Når jeg tester koden din så låser ikke GUI seg for meg.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...