以下は JE2BWM ほかが作成した翻訳 です。 原文は University of California より GFDL で配付されており、 この翻訳も GFDL に従います。
原文: Python scripting framework   (翻訳対象の更新日付は 6:05 PM UTC, October 02 2005 です)。

Python スクリプティング・フレームワーク

boinc.gif
(英語のみ)

まず、前提とするソフトウエアの中の、 Python に関係するところをご覧ください。

構成

boinc/py/Boinc というディレクトリに Boinc用の[Python] モジュールが置かれています。 ですから、pythonのパスに boinc/py/ が入れてあれば、 例えば、以下のような書き方ができます。
from Boinc.setup_project import *
pythonのパスに boinc/py/ が必ず入るように するには、以下のようにします。
import boinc_path_config
boinc_path_config は、configureが関連するディレクトリに 置く特別なモジュールで、[pythonのシステムパスである] sys.path を適切に変更するものです。

プロジェクトごとに特有な設定

boinc_project_path というモジュールを、 config.xmlrun_state.xmlへのパスを得るために import します。 これらのファイルへのデフォルトのパスは、 スクリプトを起動したディレクトリの親ディレクトリです。 このデフォルトは下記のようにして、置き換えることができます。
  1. 直接このファイル[boinc_project_path.py] を修正する方法。 (この方法は、サーバに1つのプロジェクトしか無いか、あるいは、 別々のコピーをそれぞれに持たせている場合訳注1 だけ使えます。
  2. 新しく boinc_project_path.py を作り、PYTHONPATH の中で デフォルトのものよりも前に置く方法。
  3. 環境変数を定義する方法
boinc_project_path.pyの例
  config_xml_filename = '/etc/boinc/yetiathome/config.xml'
  run_state_xml_filename = '/var/lib/boinc/yetiathome/run_state.xml'
詳細については、ソースファイル boinc/py/Boinc/boinc_project_path.py をご覧ください。

python で書かれたスクリプトを置くディレクトリ

boinc/py/Boinc/*.py 主要な BOINC 用 python モジュールの置き場所
boinc/sched/start BOINCの起動 / 定期的な仕事を制御する親プログラム
boinc/tools/xadd [BOINC]データベースに各種オブジェクトを追加します。
boinc/tools/make_project プロジェクトの作成
boinc/tools/update_versions 関連するすべてのコア・クライアントとアプリケーションの実行可能ファイルを、 ダウンロード・ディレクトリおよび[BOINC]データベースに追加します。
boinc/test/test*.py
cgiserver.py
テスト用スクリプト: テスト用フレームワーク をご覧ください。

boinc/py/Boinc/にあるPython モジュール

boinc_path_config.py.in Configure は、必要なディレクトリの全てに boinc_path_config.py を置きます。 [boinc_path_config.py.in はその雛形です]。 前述の説明を参照してください。
boinc_project_path.py config.xml ほかのファイルが見えるように 設定します。 前述の説明を参照してください。
configxml.py config.xmlrun_state.xml を読み書きします。 詳細は、それぞれ pydocで見てください。
boinc_db.py これは自動生成されるスクリプトで、 データベース関連の定数指定が入っています。 たとえば、 RESULT_OUTCOME_SUCCESS = 1
setup_project.py プロジェクト作成のための内部モジュールです。 make_project と テスト用スクリプトを参照してください。
database.py データベース[アクセスのため]のバックエンド関数と データベース運用操作を定義しています。 後述の説明を見てください。 .
db_mid.py [データベースの] 'middle-end' として、組み込むかどうかを 選択できるモジュールです。 データベース内のオブジェクトを直接出力できるようにして、 デバッグを容易にします。
util.py 雑多な機能の集まりです。
version.py.in 版ごと、またはプラットフォームに依存する定義であり、 configure の入力となります。

Python データベース・アクセス

Database.py は、データ操作を容易にするためのもので、 データベース用バックエンド・ライブラリおよび、 データベース・テーブルとオブジェクトとの関係を定義しています。

全てのデータベース・テーブルは、 対応するクラスを持ちます。 テーブルの行もクラスをもっていて、 各カラムはそのクラスのメンバーです。 [テーブルの行を区別する] id の値訳注2は、 オブジェクトとの間で双方向に自動変換されます。 まずは、 database モジュールを import してください:

  from Boinc import database
データベースに接続します:
  database.connect_default_config()
id でオブジェクトを検索するために、'[ ]'オペレータを使って テーブル・クラスに添え字をつけることができます。 例えば以下のとおり。
  # 問い合わせ 'select * from project where id=1' の実行。 
  # 該当する project が見つからなければ、例外があがる。 
  project_with_id_1 = database.Projects[1]
テーブルクラスのもつ find 関数は、 引数にしたがって MySQL の問い合わせを作成・実行します:
  # このコードは、不定の個数 (0, 1, 2, ...)のプラットフォームを返却する。 
  # 以下の問い合わせを実行する
  #    'select * from platform where user_friendly_name="commodore 64"'
  #
  list_of_platforms_called_c64 = database.Platforms.find(
      user_friendly_name = 'Commodore 64')
'find' 関数は引数をいくつでも受け取ることができます。 それらは、 論理積(AND)で結ばれている[複数の条件]として扱われます。 カスタムSQLによる問い合わせ(好きなことができます)のような、 より進んだ使い方については、pydocで見て下さい。
  all_apps = database.Apps.find()
  finished_yeti_wus = database.Workunits.find(
      app = database.Apps.find(name='YETI@home')[0],
      assimilate_state = ASSIMILATE_DONE)
オブジェクト(つまり、テーブルの行)は、カラム・データを メンバーとして持つので、直接それらを読み、変更ができます。
  user_quarl = database.users.find(email_addr='quarl@quarl.org')[0]
  print 'name =', user_quarl.name
  user_quarl.postal_code = 97404
新しいデータベース・オブジェクトを生成するには、 Pythonのオブジェクトを作って、その初期化メソッドに 全ての値を引数として与えます:
  new_app = database.App(name='SPAGHETTI@home',
                         min_version=1,
                         create_time=time.time())
新オブジェクトの作成を含め、[データベースへの] 何らかの変更を確定させる には、 commit() を呼び出して下さい。 ( boinc/tools/add.py というツールは、 この機能へのコマンドライン・インタフェースなのです):
  user_quarl.commit()  # UPDATE の実行
  new_app.commit()     # INSERT の実行
オブジェクトを[データベースから] 削除するには、 remove() を呼び出してください:
  team_eric_test = database.Teams(name="Eric's Test Team")[0]
  team_eric_test.remove()
  #                        OR
  for team in database.Teams(name="Eric's Test Team"):
      team.remove()
  #                        OR
  map(database.Team.remove,database.Teams(name="Eric's Test Team"))
idで関連づけられたオブジェクトにアクセスするには、 そのフィールド名に "id" サフィックスをつけないでアクセスします: ( result テーブルには、'workunitid' と 'hostid' というカラムがあり、 host テーブルには userid という カラムがあります)
  wu_1234 = database.Workunits.find(name='1234.wu')[0]
  results_of_wu_1234 = database.Results.find(workunit=wu_1234)
  for result in results_of_wu_1234:
      os.system("echo 'you are crunching %s' | mail '%s'" %(
                 result.name, result.host.user.email_addr))
[データベースの] テーブル名 Pythonでのテーブルオブジェクト Pythonでの行オブジェクトのクラス
projectProjectsProject
platformPlatformsPlatform
core_versionCoreVersionsCoreVersion
appAppsApp
app_versionAppVersionsAppVersion
userUsersUser
teamTeamsTeam
hostHostsHost
workunitWorkunitsWorkunit
resultResultsResult
workseqWorkseqsWorkseq

(訳注1):別々のコピーをそれぞれに持たせている場合
直訳です。 boinc_project_path.py をコピーして別々に持つ話だと思われます。
(訳注2):id
BOINCデータベースの多くのテーブルにある id という名前のフィールドとその値のこと。 これで、各テーブル内の行を識別し、他のテーブルの行との関係づけをしています。 インストールディレクトリの下の db/schema.sql を見ると id の使い方が想像できます。

BOINCの訳のメインページに戻る | (原文のメインページに戻る)
 

最終更新時刻 00:50:28, 2006年08月12日(JST)
Copyright © 2009 University of California. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation.
Copyright © 2009 Komori Hitoshi(je2bwm at jarl.com). Japanese translation from English web pages on BOINC. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation.