python - Script calling multiple other scripts erroring due to undefined functions -
i'm unsure again i'm sure going simple...
basically, i'm trying make first script call/execute bunch of other scripts problem want each individual script contain own functions not called first secript...
first script/main script:
from datetime import date, timedelta sched import scheduler time import time, sleep, strftime import random s = scheduler(time, sleep) random.seed() def periodically(runtime, intsmall, intlarge, function): ## current time currenttime = strftime('%h:%m:%s') ## if currenttime anywhere between 23:40 , 23:50 then... if currenttime > '23:40:00' , currenttime < '23:50:00': ## call clear clear() ## update time currenttime = strftime('%h:%m:%s') ## idle time while currenttime > '23:40:00' , currenttime < '23:59:59' or currenttime >= '00:00:00' , currenttime < '01:30:00': ## update time currenttime = strftime('%h:%m:%s') runtime += random.randrange(intsmall, intlarge) s.enter(runtime, 1, function, ()) s.run() def callscripts(): print "calling functions" errors = open('error(s).txt', 'a') try: execfile("data/secondary.py") except exception e: errors.write(str(e)) errors.write(""" """) errors.close() while true: periodically(2, -1, +1, callscripts)
below secondary.py
import win32con win32api import * win32gui import * class windowsballoontip: def __init__(self, title, msg): message_map = { win32con.wm_destroy: self.ondestroy,} # register window class. wc = wndclass() hinst = wc.hinstance = getmodulehandle(none) wc.lpszclassname = 'pythontaskbar' wc.lpfnwndproc = message_map # specify wndproc. classatom = registerclass(wc) # create window. style = win32con.ws_overlapped | win32con.ws_sysmenu self.hwnd = createwindow(classatom, "taskbar", style, 0, 0, win32con.cw_usedefault, win32con.cw_usedefault, 0, 0, hinst, none) updatewindow(self.hwnd) # icons managment iconpathname = "icon1.ico" ## location icon file icon_flags = win32con.lr_loadfromfile | win32con.lr_defaultsize try: hicon = loadimage(hinst, iconpathname, win32con.image_icon, 0, 0, icon_flags) except: hicon = loadicon(0, win32con.idi_application) flags = nif_icon | nif_message | nif_tip nid = (self.hwnd, 0, flags, win32con.wm_user+20, hicon, 'tooltip') # notify shell_notifyicon(nim_add, nid) shell_notifyicon(nim_modify, (self.hwnd, 0, nif_info, win32con.wm_user+20, hicon, 'balloon tooltip', msg, 200, title)) # self.show_balloon(title, msg) sleep(5) # destroy destroywindow(self.hwnd) classatom = unregisterclass(classatom, hinst) def ondestroy(self, hwnd, msg, wparam, lparam): nid = (self.hwnd, 0) shell_notifyicon(nim_delete, nid) postquitmessage(0) # terminate app. # function def balloon_tip(title, msg): w=windowsballoontip(title, msg) balloon_tip("test test", "running") def hi(): print "hi" hi()
error:
global name 'windowsballoontip' not defined
full error:
traceback (most recent call last): file "c:\main.py", line 48, in <module> periodically(2, -1, +1, callscripts) file "c:\main.py", line 27, in periodically s.run() file "c:\python27\lib\sched.py", line 117, in run action(*argument) file "main.py", line 34, in callscripts execfile("data/secondary.py") file "data/secondary.py", line 93, in <module> balloon_tip("test test", "running") file "data/secondary.py", line 78, in balloon_tip w=windowsballoontip(title, msg) nameerror: global name 'windowsballoontip' not defined
how go fixing this?
thanks in advance hyflex
first of all,
class windowsballoontip:
should be
class windowsballoontip(object):
because former old style class, has disappeared in python 3 , in recent versions of python 2.x backwards compatibility.
ethan's answer correct, unclear if you're asking question. full explanation here.
when ballon_tip()
run, first searches local namespace -- balloon_tip()
's namespace -- called windowsballoontip
. when can't find it, searches global namespace. since didn't provide globals
parameter execfile()
, defaults namespace of callscripts()
, doesn't have named windowsbaloontip
inside of it, , errors.
to fix this, can pass globals()
argument execfile
, pollute global namespace of main script, don't want. can declare inside of secondary.py global, don't want since whole point test secondary.py.
the issue execfile
. execfile
ugly, hack-y way things. import
better. 1 solution write inside secondary.py:
def test_harness(): balloon_tip("test test", "running") hi()
then, import secondary, traceback
inside main script, , change callscripts() this:
def callscripts(): print "calling functions" errors = open("errors(s).txt", "a") try: secondary.test_harness() except: errors.write(traceback.format_exc() + '\n')
edit in response comment: @ top of script, import traceback
, then:
def callscripts(): print "calling functions" errors = open("errors(s).txt", "a") try: execfile("data/secondary.py", {}) except: errors.write(traceback.format_exc() + '\n')
Comments
Post a Comment