【Time系列二】自动关机脚本

        今天在弄那个自动关机脚本的时候,遇到最大的麻烦就是怎么像电脑一样显示关机时间,看

了其他大神的博客,明白了原来用的是我没学过的datetime模块和time.strptime模块 ! ! !

        接下来,就让我们一点点来实现它!

        参考出处: http://www.xinghaixu.com/archives/685

 

        其实说的那么高端(装逼)的自动关机, 就是调用系统的shutdown命令,当我们导入os模块时

,就把电脑的一些系统命令都导入进去了! 比如: 可以试试os.system("inconfig"), 执行后是这样的 !

是不是和启动命令行(按 Win+R —> cmd )再输入config是一样的?

   

 

-------------------------------------------------------------------------------------------------------------------

1. 所以第一步就是, 使用shutdown -s -t *

(*表示秒数,比如shutdown -s -t 3600,就是1小时后关机)

1 # coding: utf-8
2 
3 import os
4 
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 str
14 # 到这里时间戳又可以变回来了—日期
15 time = time.strftime("%H:%M:%S", time.localtime(time_stamp))
16 
17 print currtime
18 print dt
19 print time_stamp
20 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) * 3600
10 # 把当前时间格式化成 "年/月/日 时:分:秒" 的格式(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 + setting
19 
20 # 把时间戳弄成str型的时间
21 shuttime = time.strftime("%H:%M:%S", time.localtime(shuttime_stamp))
22 
23 # 之所以要时间戳, 就是要把关机后的时间在这里打印出来
24 print u"您的爱机将在%s关机..." % shuttime
25 
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_stamp
26 minus =  abs(curr_time_stamp - time_stamp)
27 
28 os.system("shutdown -s -t %s" % int(minus))
29 
30 print u"您的电脑将在%s关机..." % setting
31 
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) * 3600
10 
11 hours = int(time.strftime("%H")) + int(hours)
12 shutTime = str(hours) + time.strftime(":%M:%S")
13 
14 print u"您的电脑将在%s关闭" % shutTime
15 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_list
13 
14 curr_time = time.localtime()
15 curr_hour = curr_time.tm_hour
16 curr_min = curr_time.tm_min
17 curr_sec = curr_time.tm_sec
18 
19 # 距离关机的总秒数 = 设置时间当天过去的秒数 - 当前时间当天过去的秒数
20 sec = int(shut_hour) * 3600 + int(shut_min) * 60 -( curr_hour * 3600 + curr_min * 60) - curr_sec
21 print u"您的爱机将在%s关机" % shut_time
22 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深夜

posted @ 2016-09-01 00:20  坏小孩D_R  阅读(690)  评论(0编辑  收藏  举报