我再次对某些东西不确定,我肯定会非常简单......
基本上,我正在尝试让我的第一个脚本调用/执行一堆其他脚本,但问题是我希望每个脚本都包含自己的函数,而不是从第一个脚本中调用...
第一个脚本/主脚本:
from datetime import date, timedelta
from sched import scheduler
from time import time, sleep, strftime
import random
s = scheduler(time, sleep)
random.seed()
def periodically(runtime, intsmall, intlarge, function):
## Get current time
currenttime = strftime('%H:%M:%S')
## If currenttime is anywhere between 23:40 and 23:50 then...
if currenttime > '23:40:00' and currenttime < '23:50:00':
## Call clear
clear()
## Update time
currenttime = strftime('%H:%M:%S')
## Idle time
while currenttime > '23:40:00' and currenttime < '23:59:59' or currenttime >= '00:00:00' and 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 as e:
errors.write(str(e))
errors.write("""
""")
errors.close()
while True:
periodically(2, -1, +1, callscripts)
以下是secondary.py
import win32con
from win32api import *
from win32gui import *
class WindowsBalloonTip:
def __init__(self, title, msg):
message_map = { win32con.WM_DESTROY: self.OnDestroy,}
# Register the window class.
wc = WNDCLASS()
hinst = wc.hInstance = GetModuleHandle(None)
wc.lpszClassName = 'PythonTaskbar'
wc.lpfnWndProc = message_map # could also specify a wndproc.
classAtom = RegisterClass(wc)
# Create the 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 TO THE 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 the app.
# Function
def balloon_tip(title, msg):
w=WindowsBalloonTip(title, msg)
balloon_tip("test test", "Running")
def hi():
print "hi"
hi()
错误:
global name 'WindowsBalloonTip' is not defined
完全错误:
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' is not defined
我将如何解决这个问题?
提前致谢 HYFLEX
答案 0 :(得分:3)
首先,
class WindowsBalloonTip:
应该是
class WindowsBalloonTip(object):
因为前者是一个旧的样式类,它已经在Python 3中消失了,并且在最新版本的Python 2.x中仅用于向后兼容。
Ethan的回答是正确的,但如果您提出这个问题,可能还不清楚。完整的解释是here。
运行ballon_tip()
时,它首先搜索本地命名空间 - balloon_tip()
的命名空间 - 以查找名为WindowsBalloonTip
的内容。当它无法找到它时,它会搜索全局命名空间。由于您没有向globals
的{{1}}参数提供任何内容,因此默认为execfile()
的命名空间,其中没有任何名为callscripts()
的内容在里面,和错误。
要解决此问题,您可以将WindowsBaloonTip
作为参数传递给globals()
,但这会污染您可能不想要的主脚本的全局命名空间。你也可以将secondary.py中的所有内容声明为全局,但是你可能不想这样做,因为整点都是测试secondary.py。
问题是execfile
。 execfile
是一种丑陋的黑客行事方式。 execfile
更好。一种解决方案是在secondary.py中编写类似的东西:
import
然后,在您的主脚本中def test_harness():
balloon_tip("test test", "Running")
hi()
,并像这样更改callscripts():
import secondary, traceback
编辑回应评论:
在脚本的顶部def callscripts():
print "Calling Functions"
errors = open("ERRORS(S).txt", "a")
try:
secondary.test_harness()
except:
errors.write(traceback.format_exc() + '\n')
,然后:
import traceback
答案 1 :(得分:1)
基本上,execfile
是一个带有文件的花哨的exec
。因此,当您调用execfile 'secondary.py'
时,Python会在调用execfile的上下文中执行secondary.py
的所有行。在这种情况下,它位于callscripts
内功能
您可能想要的是subprocess。