You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Python的os包以非系统时钟时间运行可执行脚本?

嘿,这个需求挺实用的——不管是测试时间敏感的脚本,还是模拟特定日期场景,不用动系统时钟就能搞定。我给你几个靠谱的方案,按需选就行:

方案1:用时间模拟工具包裹执行命令(通用型,适合所有可执行文件)

这是最省心的办法,不用改原脚本,直接用工具拦截目标程序的系统时间调用,返回你指定的时间。

针对 Linux/macOS:用 faketime

faketime 是个轻量工具,能让指定程序以为当前时间是你设定的日期,完全不影响系统时钟。

  1. 先安装它:
    • Ubuntu/Debian:sudo apt install faketime
    • macOS:brew install faketime
  2. 然后在调用脚本时,把命令用 faketime 包裹起来。比如你原来用 os.system("./your_script.sh"),现在改成:
    import subprocess
    # 推荐用subprocess替代已废弃的os.system/os.command
    subprocess.run(['faketime', '2023-10-01 12:00:00', './your_script.sh'])
    
    这里的时间格式很灵活,比如还能写 "+1d"(往后推1天)、"last friday 14:00" 这种自然语言。

针对 Windows:用 RunAsDate

Windows 下可以用免费工具 RunAsDate,它能让程序在指定的日期时间下运行:

  1. 先下载 RunAsDate.exe(不用安装,直接用)
  2. 调用时的命令格式:
    import subprocess
    subprocess.run([
        "C:\\path\\to\\RunAsDate.exe",
        "/date", "10/01/2023",
        "/time", "12:00:00",
        "C:\\path\\to\\your_script.exe"
    ])
    
方案2:修改Python脚本内部的时间依赖(仅针对Python脚本)

如果你要执行的脚本是Python写的,那可以直接在脚本里mock时间模块,不用依赖外部工具。

方法A:用 freezegun 库(推荐)

freezegun 是专门用来mock时间的Python库,用法超简单:

  1. 先安装:pip install freezegun
  2. 在被执行的脚本里加装饰器,或者在调用时注入:
    比如你的目标脚本 test_script.py 内容是:
    from datetime import datetime
    print(f"Current time: {datetime.now()}")
    
    那你可以写一个调用脚本,用freezegun包裹它的执行:
    from freezegun import freeze_time
    import subprocess
    import sys
    
    # 或者直接在目标脚本里加@freeze_time("2023-10-01 12:00:00")装饰器
    with freeze_time("2023-10-01 12:00:00"):
        # 这里如果是导入模块执行的话更直接,比如import test_script
        # 如果是独立脚本,就用subprocess调用
        subprocess.run([sys.executable, "test_script.py"])
    

方法B:手动patch时间函数(不用第三方库)

如果不想装额外库,可以手动替换time或datetime的方法:

import time
from datetime import datetime, timezone

# 保存原函数
original_time = time.time
original_now = datetime.now

# 设定目标时间(这里是2023-10-01 12:00:00的时间戳)
target_timestamp = 1696142400

# 替换函数
def mock_time():
    return target_timestamp

def mock_now(tz=None):
    if tz:
        return datetime.fromtimestamp(target_timestamp, tz=tz)
    return datetime.fromtimestamp(target_timestamp)

time.time = mock_time
datetime.now = mock_now

# 之后执行你的脚本逻辑,比如import test_script
方案3:动态库拦截系统调用(进阶,适合C/C++程序)

如果是C/C++编译的可执行文件,且没法用faketime,可以自己写一个动态库,拦截time()、gettimeofday()这类系统时间函数,返回指定时间,然后用LD_PRELOAD(Linux)加载这个库再执行程序。这个比较复杂,适合特定场景,一般方案1足够覆盖大部分需求。

小提醒:别用os.command啦

Python里的os.command已经被废弃好久了,官方推荐用subprocess模块,它更安全、功能更全,能更好地控制命令执行的输入输出。

内容的提问来源于stack exchange,提问作者naseefo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:50:15