3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[OCI]jupyter notebookで作成したpythonプログラムを自動実行する(OL8)

Last updated at Posted at 2024-12-12

1. はじめに

OL8上にインストールした jupyter notebook で作成した python プログラムを cron 登録し、自動実行させます。

前提条件

https://qiita.com/twakimura/items/e2b145e2460c388ba0cc
この記事を参考に Compute インスタンス上に jupyter notebook を導入しています。

2. コードの作成

ここでは、TESTテーブルの主キーをカウントアップした値とpython実行時に渡された引数を挿入する処理を記載しています。
プログラムに渡される引数は sys.argv[n] で取得できます。

batch.ipynb
import os
import sys
import pandas as pd
from sqlalchemy import create_engine

# 引数チェック、引数が設定されていないとエラーとする。
try:
    param1 = sys.argv[1]  # パラメータ1
except IndexError:
    print("Error: You must provide one parameter.")
    sys.exit(1)

# oracledb接続情報の取得
un = os.environ.get('ORAUSER')
pw = os.environ.get('ORAPASS')
cs = os.environ.get('ORATNS')
wallet_dir = os.environ.get('TNS_ADMIN')
wallet_pw = os.environ.get('WALLETPASS')

# SQLAlchemyエンジンを作成
engine = create_engine(f'oracle+oracledb://{un}:{pw}@{cs}', connect_args={
    "config_dir": wallet_dir,
    "wallet_location": wallet_dir,
    "wallet_password": wallet_pw
})

# DB接続処理
with engine.connect() as conn:
    
    # 主キーの最大値をカウントアップして挿入キーにする
    query = "SELECT MAX(TESTNO) FROM TEST"
    df = pd.read_sql(query, con=conn)
    new_testno = df.loc[0, 'MAX(TESTNO)'] + 1
    
    # TESTNAMEには引数で渡された値を設定する。
    list = [[new_testno,param1]]
    df = pd.DataFrame(list, columns=["TESTNO", "TESTNAME"])
    
    # 既存のテーブルにデータを追加
    df.to_sql('test', con=engine, if_exists='append', index=False)

# 接続を閉じる
engine.dispose()

3. .pyファイルの作成

jupyter notebook で作成した .ipynb ファイルを linux のコマンドライン上で実行できるように .py ファイルに変換します。

$ jupyter nbconvert --to script batch.ipynb
[NbConvertApp] Converting notebook batch.ipynb to script
[NbConvertApp] Writing 1131 bytes to batch.py
$ ls -l batch.*
-rw-r--r--. 1 oracle oinstall 3451 Dec  9 10:42 batch.ipynb
-rw-r--r--. 1 oracle oinstall 1349 Dec  9 10:50 batch.py

.py ファイルが作成されました。
実行は以下でできます。

$ python batch.py Test3

データが格納されたことを確認します。

SQL> select * from TEST;

    TESTNO TESTNAME
---------- --------------
         3 Test3
         1 テスト1
         2 テスト2

SQL>

4. cron登録

定期的に実行するバッチ処理はcronに登録して実行しますが、上記の .py ファイル実行コマンドをそのままcron登録してもうまく動きません。
cron実行時はユーザーのbash_profile等が考慮されないためです。
そのため、シェルファイルを作成し、その中で環境変数の読込や実行ディレクトリ指定、.py の実行を記載します。
cronの検証として毎分実行するようにしますので、引数には実行時の時間を渡して確認するようにしました。

run_batch.sh
#!/bin/bash
# 環境変数の読込
source ~/.bashrc
# 実行ディレクトリに移動(相対パスの記載がある場合は必要)
cd ~/python
# batch.pyの実行
python batch.py "$(date '+%T')"

作成したシェルには実行権限を付けておきましょう。
シェルの準備ができたらcron登録します。

$ crontab -e
 * * * * * ~/sh/run_batch.sh >> ~/log/run_batch.log 2>&1

数分たったらcronの設定を#でコメントアウトして停止します。
データが格納されたことを確認します。

SQL> select * from TEST;

    TESTNO TESTNAME
---------- --------------
         3 Test3
         1 テスト1
         2 テスト2
         4 01:52:01
         5 01:53:02

SQL>

これで jupyter notebook で作成した python プログラムを自動実行することができました。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?