dak ブログ

python、rubyなどのプログラミング、MySQL、サーバーの設定などの備忘録。レゴの写真も。

python で logging を使ってログ出力

2021-09-20 15:36:02 | python
python で logging を使ってログを出力する方法のメモ。

dictConfig() で yaml でのログ出力設定に従って、logger を初期化します。
import sys
import yaml
import logging
from logging.config import dictConfig
from foo import Foo

def main():
    conf_file = 'config.yml'
    with open(conf_file) as file:
        conf = yaml.safe_load(file)
        dictConfig(conf['logger'])
    logger = logging.getLogger(__name__)

    logger.info('*** main start ***')

    foo = Foo()
    foo.bar()

    return 0

if __name__ == '__main__':
    res = main()
    exit(res)

上記のプログラムから呼び出される Foo クラスでは、コンストラクタで logging.getLogger() で logger を取得し、
bar() メソッドで INFO ログを出力します。
import logging

class Foo:
    def __init__(self):
        self.logger = logging.getLogger(__name__)

    def bar(self):
        self.logger.info('*** bar info ***')

yaml の設定ファイルで logger、その他の設定を読み込みます。
settings:
  key1:
  key2:
  key3:

logger:
  version: 1
  formatters:
    file_log_format:
      format: '[{asctime}] [{levelname}] [{module}] [{funcName}] {lineno}: {message:s}'
      datefmt: '%Y-%m-%d %H:%M:%S'
      style: '{'
  handlers:
    file:
      class : logging.handlers.TimedRotatingFileHandler
      formatter: file_log_format
      filename: test.log
      when: MIDNIGHT
      backupCount: 7
      encoding: utf-8
  root:
      level: INFO
      handlers:
        - file
  disable_existing_loggers: False

上記のプログラムを実行すると、以下のようなログが出力されます。
[2021-09-19 23:32:45] [INFO] [test2] [main] 22: *** main start ***
[2021-09-19 23:32:45] [INFO] [foo] [bar] 13: *** bar info ***


python から kuromoji を実行

2021-09-20 02:41:29 | python
python から kuromoji を実行する方法のメモ。

以前の「python から java プログラムを実行」する方法を元にして、python から kuromoji を実行します。

まず、以下の URL から kuromoji をダウンロードします。
https://github.com/atilika/kuromoji/downloads

そして、パスの指定を簡単にするため、kuromoji の jar とpy4j の jar をカレントディレクトリにコピーします。
以前と同様に以下のプログラムをコンパイル・実行します。
import py4j.GatewayServer;

public class GwTest1 {
    public static void main(String[] args) {
        GwTest1 app = new GwTest1();
        GatewayServer server = new GatewayServer(app);
        server.start();
    }
}

java -classpath .:py4j0.10.9.2.jar:kuromoji-0.7.7.jar GwTest1

python から kuromoji を実行するプログラムは以下のようになります。
import sys
from py4j.java_gateway import JavaGateway

def main():
    gw = JavaGateway()

    str = 'サンプルプログラムを実行します。'

    tokenizer = gw.jvm.org.atilika.kuromoji.Tokenizer.builder().build()
    jtkns = tokenizer.tokenize(str)

    for i in range(len(jtkns)):
        jtkn = jtkns[i]
        tkn = {
            'form': jtkn.getSurfaceForm(),
            'base': jtkn.getBaseForm(),
            'read': jtkn.getReading(),
            'pos': jtkn.getAllFeatures(),
        }
        print(tkn)

    return 0

if __name__ == '__main__':
    res = main()
    exit(res)

上記のプログラムを実行すると、以下のように形態素解析結果が出力されます。
$ python kuromoji1.py
{'form': 'サンプル', 'base': 'サンプル', 'read': 'サンプル', 'pos': '名詞,一般,*,*,*,*,サンプル,サンプル,サンプル'}
{'form': 'プログラム', 'base': 'プログラム', 'read': 'プログラム', 'pos': '名詞,サ変接続,*,*,*,*,プログラム,プログラム,プログラム'}
{'form': 'を', 'base': 'を', 'read': 'ヲ', 'pos': '助詞,格助詞,一般,*,*,*,を,ヲ,ヲ'}
{'form': '実行', 'base': '実行', 'read': 'ジッコウ', 'pos': '名詞,サ変接続,*,*,*,*,実行,ジッコウ,ジッコー'}
{'form': 'し', 'base': 'する', 'read': 'シ', 'pos': '動詞,自立,*,*,サ変・スル,連用形,する,シ,シ'}
{'form': 'ます', 'base': 'ます', 'read': 'マス', 'pos': '助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス'}
{'form': '。', 'base': '。', 'read': '。', 'pos': '記号,句点,*,*,*,*,。,。,。'}


python から java プログラムを実行

2021-09-20 00:20:09 | python
python から java プログラムを実行する方法のメモ。

python から java プログラムを実行するには、py4j を使います。
py4j のインストール方法は以下の通り。
pip install py4j

自分の環境では以下に jar ファイルがインストールされました。
/usr/local/share/py4j/py4j0.10.9.2.jar


まず、java プログラム(GwTest1.java)を作成します。
import py4j.GatewayServer;

public class GwTest1 {
    public static void main(String[] args) {
	GwTest1 app = new GwTest1();
	GatewayServer server = new GatewayServer(app);
	server.start();
    }
}

そして、java プログラムをコンパイル・実行します。
javac -classpath /usr/local/share/py4j/py4j0.10.9.2.jar GwTest1.java
java -classpath .:/usr/local/share/py4j/py4j0.10.9.2.jar GwTest1

次に、python プログラムを作成します。
ここでは、java の Date クラスで日付を取得します。
import sys
from py4j.java_gateway import JavaGateway

def main():
    gw = JavaGateway()

    date = gw.jvm.java.util.Date()
    print(date)

    return 0

if __name__ == '__main__':
    res = main()
    exit(res)

上記のプログラムを実行します。
$ python test1.py
Sun Sep 19 08:33:39 PDT 2021

java の Date クラスにより、python で日付情報を取得することが確認できました。