Pythonで自動スクリプトを定期的に実行させたいとき、
「一定時間だけ動かして、朝になったら自動で止めたい」と思ったことはありませんか?
この記事では、次のようなニーズを叶えるテンプレートを紹介します。
- 子スクリプトを何度もループ実行したい
- 朝6時まで動かして自動で停止させたい
- エラーで止まっても、確認後にEnterキーで再開したい
- WindowsだけでなくLinuxやmacOSでも動かしたい
夜間バッチ、簡易監視、スクレイピングなどに役立つ自動実行テンプレートです。
\ 業務自動化の定番書。Excel・ファイル処理の実践例が豊富 /
目次
できることまとめ
- 指定したPythonスクリプトをループ実行
- 深夜〜朝6時など、STOP_HOURまで動かして自動停止
- エラー時はブラウザなどを確認してからEnterで再開
- 日付をまたいでも確実に朝6時に終了
使用ライブラリ
ライブラリ | 目的 |
---|---|
subprocess | 子スクリプトの実行 |
datetime | 停止時刻の計算 |
time | スリープ処理 |
msvcrt (Windows)/ select (Linux) | キー入力検知 |
pathlib / sys | パス・Python環境の取得 |
【Windows版】Pythonでスクリプトを繰り返し実行し、朝6時に自動停止
Windows専用コード(msvcrtを使用)
\ ブラウザ操作を自在に自動化。記事内コードの理解が深まります /
¥3,000 (2025/06/29 16:32時点 | Amazon調べ)

# -*- coding: utf-8 -*-
"""
手動で起動 → 子スクリプトをループ実行 → 次の STOP_HOUR で自動停止
エラー終了ならブラウザを残して Enter 待機
"""
import subprocess, sys, time, datetime as dt, msvcrt
from pathlib import Path
# ========= ここだけ設定 =========
PYTHON_EXE = sys.executable # 使う Python
TARGET = Path(r"C:\scripts\main.py") # 子スクリプト
STOP_HOUR = 6 # 朝 06:00 で停止
PAUSE_ON_ERR = True # エラー時は Enter 待機
# =================================
def next_cutoff(now: dt.datetime) -> dt.datetime:
cutoff = now.replace(hour=STOP_HOUR, minute=0, second=0, microsecond=0)
if now >= cutoff:
cutoff += dt.timedelta(days=1)
return cutoff
def wait_enter_or_cutoff(cutoff: dt.datetime) -> bool:
while True:
if dt.datetime.now() >= cutoff:
return False
if msvcrt.kbhit() and msvcrt.getwch() == '\r':
return True
time.sleep(0.5)
def main():
cutoff = next_cutoff(dt.datetime.now())
print(f"★ 次の停止予定 : {cutoff:%Y-%m-%d %H:%M}")
while True:
print(f"[{dt.datetime.now():%H:%M}] {TARGET.name} を起動")
ret = subprocess.call([PYTHON_EXE, str(TARGET)])
if dt.datetime.now() >= cutoff:
print(f"[{dt.datetime.now():%H:%M}] cutoff を過ぎたため終了します。")
break
if ret != 0:
print(f"[ERR] 終了コード {ret}. ブラウザを確認後 Enter で続行。")
if PAUSE_ON_ERR:
if wait_enter_or_cutoff(cutoff):
continue
else:
break
else:
break
time.sleep(1)
if __name__ == "__main__":
try:
main()
except KeyboardInterrupt:
print("\nユーザー操作で終了しました。")
subprocess.call()
で実行されるスクリプトの例(Seleniumの場合)
テンプレートでは、何度も実行されるスクリプトとして main.py
を指定しています。
その中身は自由ですが、たとえば以下のようなSeleniumを使った自動操作スクリプトを設定できます。
# main.py の一例(ChromeでGoogle検索)
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://www.google.com")
search = driver.find_element(By.NAME, "q")
search.send_keys("Python 自動化")
search.submit()
driver.quit()
このようなmain.py
を TARGET = Path(...)
に設定しておけば、ブラウザ起動 → 検索 → 終了 を
繰り返し実行し、指定時刻に自動停止するようになります。
【Linux/macOS版】Pythonで同様の自動実行を行う方法
Linux/macOS対応コード(selectを使用)
# -*- coding: utf-8 -*-
"""
Linux/macOS 対応版。Enter待機に select を使う。
"""
import subprocess, sys, time, datetime as dt, select
from pathlib import Path
# ========= ここだけ設定 =========
PYTHON_EXE = sys.executable
TARGET = Path("/home/yourname/scripts/main.py")
STOP_HOUR = 6
PAUSE_ON_ERR = True
# =================================
def next_cutoff(now: dt.datetime) -> dt.datetime:
cutoff = now.replace(hour=STOP_HOUR, minute=0, second=0, microsecond=0)
if now >= cutoff:
cutoff += dt.timedelta(days=1)
return cutoff
def wait_enter_or_cutoff(cutoff: dt.datetime) -> bool:
print("Enterキーで再開(停止時刻を過ぎたら終了)…")
sys.stdin.flush()
while True:
now = dt.datetime.now()
timeout = (cutoff - now).total_seconds()
if timeout <= 0:
return False
rlist, _, _ = select.select([sys.stdin], [], [], min(timeout, 0.5))
if rlist:
line = sys.stdin.readline()
if line.strip() == "":
return True
time.sleep(0.1)
def main():
cutoff = next_cutoff(dt.datetime.now())
print(f"★ 次の停止予定 : {cutoff:%Y-%m-%d %H:%M}")
while True:
print(f"[{dt.datetime.now():%H:%M}] {TARGET.name} を起動")
ret = subprocess.call([PYTHON_EXE, str(TARGET)])
if dt.datetime.now() >= cutoff:
print(f"[{dt.datetime.now():%H:%M}] cutoff を過ぎたため終了します。")
break
if ret != 0:
print(f"[ERR] 終了コード {ret}. 確認後、Enter で続行。")
if PAUSE_ON_ERR:
if wait_enter_or_cutoff(cutoff):
continue
else:
break
else:
break
time.sleep(1)
if __name__ == "__main__":
try:
main()
except KeyboardInterrupt:
print("\nユーザー操作で終了しました。")
\ 大量データを一括取得したい人の必携バイブル /
解説:日付をまたいでも確実に停止する仕組み
if now >= cutoff:
cutoff += dt.timedelta(days=1)
この部分によって、すでに6時を過ぎていたら翌日の6時まで待機
→ つまり、当日も翌日も適切に判断して停止時刻を決定します。
活用シーン
- 夜間だけ動かしたい自動スクレイピング
- 6時までで止めたいSNS自動投稿処理
- 試験的にスクリプトを監視しながら連続実行
\ 24 時間稼働の自動化サーバーを手軽に構築できます /
¥14,980 (2025/06/29 16:36時点 | Amazon調べ)

カスタマイズ例
- 停止時刻を「6時以外」にしたいときは
STOP_HOUR
を変更 - ログファイル出力を追加すれば記録用にも使える
- Linux対応の
wait_enter_or_cutoff
はターミナル専用の仕組み(GUIから実行する場合は注意)
まとめ
このテンプレートを使えば、次のような運用が簡単に実現できます。
- Pythonで別スクリプトを繰り返し実行
- 指定した時間(例:朝6時)で自動的に停止
- エラー発生時はブラウザ確認後にEnterで再開可能
- Windows・Linux/macOSの両方に対応!
ぜひ、自動化の第一歩としてこのコードを活用してみてください。