"Python" (外部評価システム)

詳細

  • Pythonバージョン3.4以降がサポートされる.
  • ほとんどの場合,Wolfram言語は自動的に一つのPython環境を設定するのでユーザが手動で設定する必要はない.高度な設定をしたい場合は,ワークフローの「ExternalEvaluate用にPythonを設定する」の手順に従うとよい.

ExternalEvaluateの使用法

  • ExternalEvaluate["Python",code] はPythonコードを実行し,Wolfram言語式として結果を返す.
  • ExternalEvaluate[{"Python","Evaluator"evaluator},code] evaluator で指定されたPython環境を使ってコードを実行する.
  • ExternalEvaluate[{"Python","Evaluator"evaluator},] evaluator として可能な値:
  • "path"Python実行ファイルの場所
    File["path"]Python実行ファイルの場所
    Association[]バーチャル環境指定
  • ExternalEvaluate[{"Python","Evaluator"assoc},]において assoc に可能な要素:
  • "Dependencies"{}pipを使って自動的にインストールされるパッケージ
    "EnvironmentName"Automatic直接生成されるバーチャル環境の名前
    "PythonRuntime"Automatic"3.11"File["/usr/bin/python3"]等,使用されるPythonランタイムの指定
    "BaseDirectory"Automatic生成されるバーチャル環境のディレクトリ
  • ExternalEvaluate["Python""type",code]"type"として可能な設定:
  • "Expression"Wolfram言語式に変換しようと試みる
    "String"外部評価子によって出力された生の文字列を与える
    "ExternalObject"結果をExternalObjectとして返す

データ型

  • Pythonに組み込まれたすべての型がサポートされている訳ではない.次のPythonの型がサポートされている:
  • boolTrue|Falseブール値
    arrayNumericArray配列(NumPyライブラリより)
    bytearrayByteArray整数0-255の列
    bytesByteArray整数0-255の不可変列
    complexComplex複素数
    dateDateObject特定の暦の日付
    datetimeDateObject時間の粒度を持つ特定の日付
    DecimalReal任意精度の実数
    dictionaryAssociationキーと値の連想
    floatReal実数値の数
    FractionRationalfractionsモジュールのfractionオブジェクト
    frozensetList一意の値の非順序不可変集合
    ImageImage画像(Python PILライブラリより)
    intInteger任意サイズの整数
    listList値の列
    longInteger任意サイズの整数
    NoneNullヌル値
    setList一意の値の非順序集合
    strString文字の値の列
    tupleList値の順序列
  • 「呼出し可能」なサポートされていないPython型はExternalFunctionを返す.他のサポートされていないPython型はExternalObjectを返す.
  • Decimalオブジェクトから返されるRealの精度は,ExternalEvaluateから返されても維持される.
  • Pythonのcomplex型は実数でなければならないので,ExternalEvaluateから返される任意のComplex式は実数値のコンポーネントを持つ.

サポートされる外部操作

  • ExternalOperation["Eval","code"]"code"の外部評価を表す.
  • ExternalOperation["Eval","code",assoc]はパラメータが assoc で与えられた"code"の外部評価を表す.
  • ExternalOperation["Call",func,arg1,arg2,]は与えられた引数が arg1, arg2, の関数func を呼び出す.
  • ExternalOperation["GetAttribute",obj,"attr"]obj の属性"attr"を得る.
  • ExternalOperation["SetAttribute",obj,"attr",val]obj の属性"attr"を与えられた値 val に設定する.
  • ExternalOperation["GetItem",obj,"item"]obj の項目"item"を得る.
  • ExternalOperation["SetItem",obj,"item",val]obj の項目"item"を与えられた値 val に設定する.
  • ExternalOperation["Import","path"]はモジュール"path"をインポートする.
  • ExternalOperation["Import","path","attr"]はモジュール"path"をインポートして,そのモジュールから属性"attr"を得る.
  • ExternalOperation["Cast",obj,"type"]obj を指定された"type"に変換する.

使用法

  • 列のテンプレート(<**>)は,Wolfram言語の式を評価したりPythonコード列に挿入したりするのに使うことができる.

例題

すべて開くすべて閉じる

  (3)

Pythonでを評価すると結果が返される:

Pythonでリストを作成すると結果が返される:

>とタイプして,ExternalEvaluateを使って評価を行うPythonコードのセルを取得する:

import math [math.sqrt(i) for i in range(10)]

指数と対数を含むリストを作成する:

[[i,math.exp(i),math.log(i)] for i in range(1,10)]

曜日を含むリストを作成する:

import calendar [calendar.day_name[i] for i in range(7)]

Fileラッパーを使ってファイルに含まれるコードを実行する:

CloudDeployを使ってコードを配備し,CloudObjectから直接コードを実行する:

URLラッパーを使ってオンラインでホストされたコードを直接実行する:

Associationを使って自動的にPython仮想環境を設定することができる:

Python仮想環境は$UserBaseDirectoryの下に作成された:

スコープ  (49)

Pythonでブール文を評価して,結果を返す:

Pythonでバイト配列を生成して,Wolfram言語でそれに相当するものを返す:

Pythonでバイト配列を扱う別の方法:

Pythonの listtuplesetfrozensetListに変換される:

Pythonの dictAssociationに変換される:

3.7以降のPythonを使う場合,辞書のキーはAssociationのように順番に並ぶ:

Pythonで複素数(Complex)を生成して,その結果を返す:

分数は自動的にRationalに変換される:

小数はRealに変換される:

Datetimeオブジェクトは自動的に変換される:

NumPy配列は自動的にNumericArrayに変換される:

Pandas DataFramesは自動的にDatasetに変換される:

PIL画像は自動的にImageに変換される:

ジェネレータは自動的にListに変換される:

反復可能なPythonオブジェクトは,明示的な変換方法が実装されていない限り,どれも自動的にListに変換される:

列のテンプレートは,Wolfram言語式をPythonコードに挿入するために使うことができる.2つの変数を設定する:

x^2+y^2はWolfram言語の中で評価され,その結果は変換されPythonのコード列に挿入される:

セッションオプション  (12)

"ReturnType"  (3)

Python評価システムでは,デフォルトの戻り型は"Expression"である:

"Expression"戻り型では,数,文字列,リスト,連想は自動的にインポートされる:

"String"戻り型は,Python関数の repr を呼び出すことによって結果の列を返す:

"Evaluator"  (5)

指定された"Evaluator"を使ってPythonコードを評価する:

Associationを使って自動的にPython仮想環境を設定することができる:

"Dependencies"は,バージョンを指定するpip様式を使った,Pythonパッケージを指定する文字列のリストでもよい:

評価子の"Dependencies"を指定するためにFileラッパーを使うこともできる:

"EnvironmentName"を指定して,仮想環境フォルダの名前をカスタマイズする:

"BaseDirectory"を指定してインストールディレクトリを変更する:

指定されたバージョンをダウンロードするために"PythonRuntime"を使うことができる:

Fileラッパーを使って,自分のPythonを使うことができる:

"SessionProlog"  (1)

"SessionProlog"を使って,セッションの最初に副作用を実行する:

"SessionEpilog"  (1)

"SessionEpilog"を使って,セッションの最後に副作用を実行する:

"Prolog"  (1)

"Prolog"を使って,それぞれの評価の前に副作用を実行する:

"Epilog"  (1)

"Epilog"を使ってそれぞれの評価の後に副作用を実行する:

コマンドオプション  (11)

"Command"  (4)

Pythonコードの列が与えられたときだけ,コマンドは直接実行される:

上記は次の形式を使ったコマンドに等しい:

Fileラッパーを使ってファイルのコードを実行する:

上記は次の形式を使ったコマンドに等しい:

URLラッパーを使って,オンラインでホストされるコードを直接実行する:

上記は次の形式を使ったコマンドに等しい:

CloudObjectにコードを置く:

クラウドから直接評価する:

上記は次の形式を使ったコマンドに等しい:

"ReturnType"  (1)

デフォルトでは,コマンドはセッションの生成中に指定される"ReturnType"を使って実行される:

コマンドで"ReturnType"を指定すると,セッションの"ReturnType"が上書きされる:

"Arguments"  (2)

"Arguments"を使って,引数付きのPython関数を呼び出す:

リスト以外の引数が与えられると,関数には単独の引数が渡される:

第一引数としてリストを渡す必要がある場合は,追加のリストで明示的にそれをラップしなければならない:

"Command"内で関数を定義し,"Arguments"で直接それを呼び出すことができる:

Ruleを使っても同じ結果を得ることができる:

ExternalFunctionを生成することによって引数を渡すこともできる:

"Constants"  (1)

"Constants"を使って,コマンドを実行する前に永続的な大域的変数を設定する:

"TemplateArguments"  (3)

コマンドを実行するとき,TemplateExpressionを行内に埋め込むことができる:

"TemplateArguments"を使ってTemplateSlotを明示的に埋めることができる:

リスト以外の引数が与えられると,テンプレートには単独のテンプレート引数が渡される:

第一引数としてリストを渡す必要がある場合,それを明示的に追加のリストでラップしなければならない:

テンプレートスロットに名前を付け,Associationを使うと,テンプレートに名前付きの引数を渡すことができる:

外部操作  (16)

"Eval"  (1)

Pythonにおける任意のコード評価を表すExternalOperationを実行する:

第2引数を使って評価のコンテキストを渡す:

"Call"  (3)

Pythonで関数を作成するExternalOperationを定義する:

ExternalOperation "Call"を実行することによる関数呼出しを定義する:

ExternalEvaluateを使って関数呼出しを表す外部操作を実行する:

"Call"操作のいずれの引数もExternalOperationにすることができる:

以下のようにして,引数を直接ExternalEvaluateに渡すこともできる:

結果は,以下のPythonコードを実行したときと同じになる:

Python関数のExternalFunctionを作成する:

"Call"操作を実行することで関数を呼び出す:

以下のようにしても同じ結果が得られる:

Python関数のExternalObjectを作成する:

"Call"操作を実行することで関数を呼び出す:

以下のようにしても同じ結果が得られる:

ExternalObjectサブ値を使うこともできる:

セッションを削除する:

"GetAttribute"  (1)

日付を扱うPythonセッションを開始する:

datetimeオブジェクトに対するExternalObjectを返す:

"GetAttribute"を使って年の属性を抽出する:

ExternalObjectサブ値を使っても同じことができる:

Python評価子では"GetAttribute"がデフォルト操作であり,ExternalOperationは省略できる:

結果は以下のPythonコードを実行したときと同じである:

セッションを削除する:

"SetAttribute"  (1)

十進数を扱うPythonセッションを開始する:

decimalモジュールに対するコンテキストを得る:

精度を6に設定する:

精度が6に設定されたことをチェックする:

結果は以下のPythonコードを実行したときと同じである:

セッションを削除する:

"GetItem"  (2)

Pythonセッションを開始する:

Pythonの辞書を作成し,それをExternalObjectとして返す:

"GetItem"を使って"name"項目を抽出する:

結果は以下のPythonコードを実行したときと同じである:

セッションを削除する:

辞書を表すExternalOperationを作成する:

項目"name"を得るための新規のExternalOperationを作成する:

ExternalEvaluateを使って操作を実行する:

"SetItem"  (1)

Pythonセッションを開始する:

辞書を使ってExternalObjectを作成する:

項目"name""joe"に設定する:

項目が"joe"に設定されたことをチェックする:

Expressionを使って,辞書全体を連想として得る:

セッションを削除する:

"Import"  (6)

"datetime"モジュールをインポートするExternalObjectを定義する:

ExternalObjectとしてモジュールを返す:

"datetime"モジュールから日付をインポートするExternalObjectを定義する:

ExternalEvaluateを使って引数で操作を呼び出す:

"datetime"モジュールをインポートするExternalObjectを定義する:

ExternalFunctionを使って メソッドを呼び出す:

セッションを削除する:

fractionsモジュールをインポートするExternalObjectを定義する:

ExternalObjectサブ値を使ってfractionを初期化する:

次のシンタックスでも同じことができる:

セッションを削除する:

"ip_address"をインポートする"Import"操作を定義する:

ExternalEvaluateを使ってアドレスインスタンスを作成する:

戻り型としてStringを使い,インスタンスのPython文字列バージョンを表示する:

"ip_address"をインポートする"Import"操作を定義する:

別のExternalOperationを使ってアドレスインスタンスを作成する:

ExternalEvaluateで操作を実行する:

"Cast"  (1)

現在の日付を表すExternalObjectを作成する:

"Expression"を使ってオブジェクトをWolfram言語式として返す:

Cast操作もExternalObjectサブ値で実行することができる:

シンボルExpressionは同じことについてのショートカットである:

オブジェクトを文字列として返す:

シンボルStringは同じ操作の近道である:

オブジェクトをExternalObjectとして返す:

シンボルExternalObjectは同じ操作の近道である:

ExternalEvaluate"ReturnType"を使っても同じことができる:

セッションを削除する:

アプリケーション  (3)

Wolfram言語でPythonのrange関数を表す:

関数を使う:

ASTモジュールを使ってPythonコードの列についてASTを返す関数を作成する:

関数を使う:

Pygmentsを使って,コードのブロックにシンタックスハイライトを行う関数を作成する:

関数を使う:

特性と関係  (1)

を使うとPythonから式を返すことができる:

式はカーネルに転送された後自動的に評価される:

Holdを使って評価を制御する:

セッションを終了する:

考えられる問題  (1)

ジェネレータは自動的にListに変換される:

無限ジェネレータを戻すと永久にカーネルがブロックされる: