我有以下代码,它在while循环中不断检查当前时间,当它最终匹配定义的time\u时,就会在if语句中运行代码。
此外,欢迎提出任何改进建议。
提前感谢您!
您所要求的是不可能的(所有操作都会在睡眠模式下停止执行)。
您可以做的是在PC重新打开和启动时标记您的文件以恢复。关于这个问题有一些很好的答案:
对于Linux情况:
对于唤醒恢复情况:
>
找到/usr/lib/pm-utils/睡眠. d
,或/etc/pm/睡眠. d
(以在您的系统中工作的为准-亲自使用的首选)
在其中添加一个脚本,如下所示:
myWakeupScript
#!/bin/sh
case "$1" in
resume)
python path/to/your_script.py
esac
使脚本可执行:chmod x/usr/lib/pm-utils/sleep。d/myWakeupScript
对于启动情况:
>
在/etc/init中放置一个脚本。d//code>:
myStartupScript
#!/bin/sh
python path/to/your_script.py
使其可执行:
chmod x/etc/init。d/myStartupScript
可能的问题和修复:
多亏了@meetamit,如果这不运行,您必须创建一个指向etc/rc的符号链接。d/
ln -s /etc/init.d/start_my_app /etc/rc.d/
对于Windows案例:
提供的解决方案几乎不言而喻,您可以根据自己的目的选择其中之一
我建议这样做(似乎最简单):
>
Windows,对吗?打开任务计划程序并创建一个带有事件日志条目触发器的新任务Microsoft-Windows-Kernel-Power、Kernel-Power以及用于睡眠/唤醒的任何EventID。
在事件上使用任务调度器和触发器。选择由事件触发,然后选择。设置基本日志:系统源:内核电源事件ID:42
任何长时间运行的Python脚本(包括您的)都将在计算机唤醒时运行,在计算机睡眠时暂停执行,然后在计算机再次唤醒时自动恢复执行。但是,脚本有几个问题可能会妨碍它正确运行,尤其是当计算机在time\u defined
中指定的时间内Hibernate时。
首先,日期时间。日期时间。now()和datetime。datetime()的精度为1微秒。取决于循环运行的速度,它可能不会计算time\u now=datetime。日期时间。now()
在定义的时间(隐式为20:00:00.000000)中指定的精确微秒内执行。如果你的电脑恰好在那一微秒内处于睡眠状态,情况尤其如此。在这两种情况下,测试都不会实现,脚本也不会从循环中出现。您现在可以通过测试time\u来解决这两个问题
其次,您的代码使用忙循环进行调度,这非常低效。这不会阻止它正确运行,但它会在运行时将处理器的一个核心固定为100%使用率。如果使用时间。sleep()
,您可以将处理器使用量减少到几乎为零。原则上,您可以使用类似时间的东西。睡眠((time\u defined-time\u now)。totalseconds())以精确睡眠正确的秒数。然而,(至少在Mac电脑上)计时器只计算计算机处于唤醒状态的秒数,因此暂停计算机会打乱时间表。然而,您可以使用一系列的短睡眠(例如,1秒)来显著提高效率,并且仍然具有相当精确的计时。
以下是修复这两个问题的一些代码:
import datetime, time
def background_program():
time_defined = datetime.datetime(2017, 4, 7, 20, 0, 0)
...
while(True):
time_now = datetime.datetime.now()
if time_now >= time_defined:
try:
# Run some code
pass
except:
print('Failed to run')
finally:
break
else:
# use a shorter delay if you want a more exact runtime
time.sleep(1)
这里有一些做同样事情的更精简的代码。我还添加了一个命令行参数,所以您可以像调用python myscript一样调用它。py—开始时间2017年4月17日20:00:00。(您还可以运行python myscript.py--help来获得一些帮助。)
import datetime, time, argparse
def background_program(time_defined):
# wait until time_defined, sleeping in short steps
# note: you could use a shorter delay for more precision
print "waiting until {}".format(time_defined.strftime('%Y-%m-%d %H:%M:%S'))
while(datetime.datetime.now() < time_defined):
time.sleep(1)
# perform scheduled action
try:
print('Running the scheduled task.')
except:
print('Failed to run')
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Run a background task.')
parser.add_argument(
'--start-time', nargs=2, default=None,
help='Specify the time to run the task, in YYYY-MM-DD HH-MM-SS format.'
)
args = parser.parse_args()
if args.start_time is not None:
start_time = datetime.datetime.strptime(' '.join(args.start_time), '%Y-%m-%d %H:%M:%S')
background_program(start_time)
问题内容: 我有一个简单的Python脚本,如果满足条件,我想停止执行。 例如: 本质上,我正在寻找一种与函数主体中的’return’关键字等效的行为,该关键字允许代码流退出该函数而不执行其余代码。 问题答案: 要退出脚本,您可以使用, 您还可以提供退出状态值,通常是整数。 以零退出,这通常被解释为成功。非零代码通常被视为错误。默认值为零退出。 打印“ aa!错误!” 并以状态代码1退出。 os模
问题内容: 我写了Python脚本来处理大量的大文本文件,并且可能 要花费很多时间 。有时,需要停止正在运行的脚本并在以后恢复它。停止脚本的可能原因是程序崩溃,磁盘空间不足或需要执行此操作的其他原因。我想为脚本实现一种“停止/恢复”机制。 在 车站 :脚本退出和保存其当前状态。 在 简历 :剧本开始,但是从最新的保存状态持续 我将使用 pickle 和 信号 模块来实现它。 我将很高兴听到如何以p
问题内容: 我能运行Linux命令状或从Java没有问题,但不能得到执行的Python脚本。 这是我的代码: 什么都没有发生。它到达了SEND,但之后就停止了… 我正在尝试执行需要root权限的脚本,因为它使用串行端口。另外,我还必须传递带有一些参数的字符串(数据包)。 问题答案: 您不能像在示例中那样在内部使用PIPE 。PIPE是shell的一部分。 你可以做 将命令放入shell脚本并使用或
问题内容: 我尝试执行以下操作(我的jar和python文件都在同一目录中): 和 无论是工作过。因此,我当时以为应该改用Jython,但我认为必须有一种更简单的方法来通过python执行jar文件。 你知道我可能做错了什么吗?或者,是否还有其他网站可以进一步研究我的问题? 问题答案: 我将以这种方式使用子流程: 但是,如果你有一个正确配置的,你应该能够直接运行jar,因为你写的。 那么,这正是您
问题内容: 我有一个简单的脚本blah.py(使用Python 2): 如果我通过以下方式执行脚本: 它输出参数,但是如果我通过以下方式执行脚本: 发生错误: 因此参数不会传递给脚本。 PATH中的python.exe。路径中也包含blah.py的文件夹。 python.exe是执行* .py文件的默认程序。 问题是什么? 问题答案: 执行脚本而不在前面键入“ python”时,你需要了解有关Wi
问题内容: 我需要从Django Shell执行Python脚本。我试过了: 但这没有用。只是在等我写东西。 问题答案: 该<<部分有误,请<改用: 你也可以这样做: 对于python3,你需要使用