今天在弄那个自动关机脚本的时候,遇到最大的麻烦就是怎么像电脑一样显示关机时间,看
了其他大神的博客,明白了原来用的是我没学过的datetime模块和time.strptime模块 ! ! !
接下来,就让我们一点点来实现它!
参考出处:
其实说的那么高端(装逼)的自动关机, 就是调用系统的shutdown命令,当我们导入os模块时
,就把电脑的一些系统命令都导入进去了! 比如: 可以试试os.system("inconfig"), 执行后是这样的 !
是不是和启动命令行(按 Win+R —> cmd )再输入config是一样的?
-------------------------------------------------------------------------------------------------------------------
1. 所以第一步就是, 使用shutdown -s -t *
(*表示秒数,比如shutdown -s -t 3600,就是1小时后关机)
1 # coding: utf-82 3 import os4 5 setting = raw_input("Setting: ")6 os.system("shutdown -s -t %s" % setting)
2. 接下来,当然是明白各个模块的用法啦!
还记得上一篇我们说过, 打印出当前系统时间有两个方法, 一个是按 "周-月-日 时/分/秒 年"
输出的time.ctime(), 一个是按自设的格式输出的time.strftime()
1 # coding: utf-8 2 3 import os 4 import time 5 6 # 按"周-月-日 时/分/秒 年"的格式显示 7 print time.ctime() 8 9 # 按自行设置的格式显示日期10 print time.strftime("%H:%M:%S")11 print time.strftime("%a %b %Y-%m-%d")12 print time.strftime("%Y/%m/%d %H:%M:%S")
3. 时间戳与时间转换
怎么给定一个时间,比如2.5个小时后,我要它关机呢?想想看,当然是把2.5 * 3600转化为秒,
再用shutdown命令关机,如果是这样,那倒没什么难的,问题是,我们要这样的效果! 精确显示关机的
时间......这就需要一些模块来转换时间了!
1 # coding: utf-8 2 3 import time 4 import datetime 5 6 # str to datetime.datetime 7 currtime = time.strftime("%Y-%m-%d %H:%M:%S") 8 dt = datetime.datetime.strptime(currtime, "%Y-%m-%d %H:%M:%S") 9 10 # datetime.datetime to time stamp(时间戳)11 time_stamp = time.mktime(dt.timetuple())12 13 # time stamp to str14 # 到这里时间戳又可以变回来了—日期15 time = time.strftime("%H:%M:%S", time.localtime(time_stamp))16 17 print currtime18 print dt19 print time_stamp20 print time
看到没,这里关键的地方就是时间戳,意味着可以把当前的时间转换为秒数,这个秒数是从格林
尼治的1970年1月1日子夜(0点)算起的,由于北京是东八区,所以是从凌晨8点算起的,这些都不重要
,重要的是,只要我们在时间戳这里,把我们要的几小时后关机的小时数转换成对应的时间戳, 那么,
不就可以显示出几小时后的系统时间了么?
【注意: 在其它语言里面的时间戳大部分都是指总毫秒数而非python的总秒数】
----------------------------------------------------------------------------------------------------------
4. 示例
方法1:利用上面说的原理进行时间戳的转换(麻烦)
我们给完整版加个取消计划关机的功能,其实也是利用系统自带的 "shutdown -a" 命令 !
1 # coding: utf-8 2 3 import os 4 import time 5 import datetime 6 7 print u"亲爱的小主,你想要设置你的电脑几小时后关机?" 8 setting = raw_input("Setting: ") 9 setting = float(setting) * 360010 # 把当前时间格式化成 "年/月/日 时:分:秒" 的格式(str类) 11 currtime = time.strftime("%Y-%m-%d %H:%M:%S")12 13 # 把str类的时间弄成datetime.datetime类的 14 dt = datetime.datetime.strptime(currtime, "%Y-%m-%d %H:%M:%S")15 16 # 把datetime.datetime类弄成时间戳(time stamp)17 time_stamp = time.mktime(dt.timetuple())18 shuttime_stamp = time_stamp + setting19 20 # 把时间戳弄成str型的时间21 shuttime = time.strftime("%H:%M:%S", time.localtime(shuttime_stamp))22 23 # 之所以要时间戳, 就是要把关机后的时间在这里打印出来24 print u"您的爱机将在%s关机..." % shuttime25 26 os.system("shutdown -s -t %s" % int(setting))
-------------------------------------------- Perfect ---------------------------Q ^ Q 完美匹配 ! !!
不过缺点嘛就是只能指定当天关机时间, 因为当设置的关机时间早于当前系统时间时, 两者相减
去的时间的绝对值加上当前系统时间,将会导入计算的时间出错,因为我们设置的是当天的 "年/月/日",
(具体大家自己尝试)!
1 # coding: utf-8 2 3 import os 4 import time 5 import datetime 6 7 print u"可爱的小主,你想要你的电脑几点关机?" 8 9 # 将设置的时间格式化成指定格式的字符串10 # 这里如果只设置成 "时:分:秒", 后面会出现溢出错误! ! !11 setting = time.strftime("%Y-%m-%d ") + raw_input("Setting: ") + ":00"12 13 # 把当前的时间(str类)赋值给currtime 14 currtime = time.strftime("%Y-%m-%d %H:%M:%S")15 16 # 把str类转化成datetime.datetime类17 dt = datetime.datetime.strptime(currtime, "%Y-%m-%d %H:%M:%S")18 curr_dt = datetime.datetime.strptime(setting, "%Y-%m-%d %H:%M:%S")19 20 # 把datetime.datetime类的变量转化成时间戳(time stamp)21 time_stamp = time.mktime(dt.timetuple())22 curr_time_stamp = time.mktime(curr_dt.timetuple())23 24 # 把时间戳转化成时间(str类)25 seconds = time_stamp + curr_time_stamp26 minus = abs(curr_time_stamp - time_stamp)27 28 os.system("shutdown -s -t %s" % int(minus))29 30 print u"您的电脑将在%s关机..." % setting31 32 ifshutdown = raw_input("If abolish:")33 if "y" in ifshutdown:34 os.system("shutdown -a")
abs()是求绝对值
升级版增加了取消关机和设定更精确时间关机的功能,具体功能大家可以自行扩展......
如果回复出现"y"取消的话:
方法2:其实之前一直被时间戳给套住了,根本就可以不用它。简单地在小时和分钟,秒上面做加减就行了
老规矩,先从简单地开始
1 # coding: utf-8 2 3 import os 4 import time 5 6 # raw_input()产生的是字符串,要转化成int才能加减 7 print u"亲爱的小主,你打算几个小时后关掉您的电脑!" 8 hours = raw_input("Setting: ") 9 seconds = int(hours) * 360010 11 hours = int(time.strftime("%H")) + int(hours)12 shutTime = str(hours) + time.strftime(":%M:%S")13 14 print u"您的电脑将在%s关闭" % shutTime15 os.system("shutdown -s -t %s" % seconds)16 17 isExit = raw_input(u"是否取消?(y/n) ".encode("gbk"))18 19 if "y" in isExit: 20 os.system("shutdown -a")
结果和上面的例子没什么两样,这里就不再截图了。
1 # coding: utf-8 2 3 import os, re, time 4 5 # 我们输入的是hh:mm的格式,所以用正则表达式按冒号分割成时间列表 6 # 当前时间一定要放在raw_input()之后,因为输入时间会消耗时间,而 7 # 变量curr_time数据一旦储存,就不会再变化。会产生时差。 8 print u"亲爱的小主,几时关闭您的爱机呢?" 9 shut_time = raw_input("Setting: ")10 shut_time_list = re.split(":|:", shut_time)11 12 shut_hour, shut_min = shut_time_list13 14 curr_time = time.localtime()15 curr_hour = curr_time.tm_hour16 curr_min = curr_time.tm_min17 curr_sec = curr_time.tm_sec18 19 # 距离关机的总秒数 = 设置时间当天过去的秒数 - 当前时间当天过去的秒数20 sec = int(shut_hour) * 3600 + int(shut_min) * 60 -( curr_hour * 3600 + curr_min * 60) - curr_sec21 print u"您的爱机将在%s关机" % shut_time22 os.system("shutdown -s -t %s" % sec)23 24 is_shut = raw_input(u"是否取消?(y/n) ".encode("gbk"))25 26 if "y" in is_shut:27 os.system("shutdown -a")
------------2017/1/12深夜