ウィジットでpycファイルを読み込んで実行するには ?
ウィジットでコンパイルされたPythonのpycファイルを実行するには、
window.external.setScriptで呼ぶPythonコード内で、モジュールとしてpycを呼び出します。
Python部のコード (func_test.py)
この作業は、PC上のテキストエディタで行います。
Python部のコードは以下のように記載しました。
import xshade
def callShade3D ():
shape = xshade.scene().active_shape()
return shape.name
Shade3Dのブラウザで選択されている形状の名前を返す単純なメソッド「callShade3D」を記載しています。
大事な点として、モジュールとして呼び出す場合は「import xshade」を先頭に入れるようにしてください。
ウィジットからの呼び出し時にこれがないと、xshadeが存在しないというエラーが発生します。
このファイルを「func_test.py」として「C:/Users/shade3d/python」に保存したとします。
拡張子pycファイルの作成 (func_test.pyc)
Pythonファイルのコンパイルは「Pythonスクリプトをコンパイルして実行」もご参照くださいませ。
Shade3Dを起動し、スクリプトウィンドウで以下のような入力を行い実行します。
import py_compile
py_compile.compile('C:/Users/shade3d/python/func_test.py')
py_compile.compileの第一引数にコンパイル対象となるスクリプトファイル名のフルパスを指定します。
Windows環境の場合、ファイルの区切り記号は「/」を使用してください。
これで「C:/Users/shade3d/python」フォルダ上に「func_test.pyc」ファイルが生成されます。
これが、コンパイルされたファイルになります。
ウィジットの記述
「CallPYC」というフォルダを作成し、以下の3つのファイルを配置しました。
ファイル名 | 内容 |
---|---|
widget.xml | XMLで記述されたウィジットの設定情報 |
index.html | HTML/JavaScriptで記述 |
func_test.pyc | Pythonコードをコンパイルしたファイル |
この「CallPYC」フォルダをShade3Dのドキュメントフォルダのwidgets内に複製してShade3Dを起動します。
「func_test.pyc」は前述したコンパイルされたPythonファイルになります。
widget.xml
<?xml version="1.0" encoding="utf-8"?>
<widget>
<uuid>aed6754c-54c1-4a9d-9287-a15cbd56bf24</uuid>
<name lang="ja">pycファイルの読み込みテスト</name>
<name lang="en"></name>
<url>index.html</url>
<version>1.0</version>
<description lang="ja">pycファイルの読み込みテスト</description>
<description lang="en">pyc file call test.</description>
<window initial_size="350 290"
position="0.42 0.63"
resizeable="true">
</window>
</widget>
index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<script type="text/javascript">
function initialize () {
}
/**
* 実行されているカレントフォルダを取得.
*/
function getCurrentFolder () {
var osType = navigator.userAgent.match(/macintosh/i) ? "Mac" : "Win";
var pathStr = location.href;
if (osType == "Mac") {
pathStr = pathStr.replace("file:///", "/");
} else {
pathStr = pathStr.replace("file:///", "");
}
pathStr = decodeURI(pathStr);
var reg = new RegExp("[^/]+.html","g");
pathStr = pathStr.replace(reg, "");
pathStr = pathStr.substr(0, pathStr.length - 1);
return pathStr;
}
function do_script () {
// ウィジットが実行されているフォルダを取得.
var curPath = getCurrentFolder();
// OSの種類 (Win/Mac).
var osType = navigator.userAgent.match(/macintosh/i) ? "Mac" : "Win";
// pycファイルを読み込むためのPythonコード.
py_src = "import sys\n";
if (osType == "Win") {
py_src += "sys.path.append(unicode('" + curPath + "', 'utf-8').encode('sjis'))\n";
} else {
py_src += "sys.path.append('" + curPath + "')\n";
}
py_src += "import func_test\n";
py_src += "result = func_test.callShade3D()\n";
// Pythonの呼び出し。結果をretに返す.
var ret = window.external.setScript(py_src);
// 結果を表示.
window.alert(ret);
}
</script>
</head>
<body onload="initialize();">
<h3>pycファイルの読み込みテスト</h3>
<hr>
<form method="POST" action="">
コンパイルされたpycファイルの読み込みテストです。<br><br>
<input type="button" value="実行" onclick="do_script();">
</form>
</body>
</html>
JavaScriptのdo_script()関数内でpycファイルのメソッドを呼び、結果をwindow.alertで表示するサンプルです。
「var curPath = getCurrentFolder();」でウィジットが実行されているフォルダを取得します。
JavaScriptでのgetCurrentFolder関数の呼び出しは、「ウィジットが実行されている絶対パスを取得」をご参照くださいませ。
次に、以下のようなPythonコードを作成しています。
import sys
# 以下はWindows環境の場合.
sys.path.append(unicode('xxx/widgets/CallPYC', 'utf-8').encode('sjis'))
# 以下はMac環境の場合.
#sys.path.append('xxx/widgets/CallPYC')
import func_test
result = func_test.callShade3D()
「import sys」の後「sys.path.append」を呼び、Pythonコードの検索パスを追加しています。
第一引数にウィジットのパスを渡しています。
この指定は「func_test.pyc」ファイルを探すために必要な処理になります。
このとき、Windows環境とMac環境で渡している文字列は異なります。
Mac環境の場合はUTF-8に統一されているためそのまま文字列を渡して問題ありません。
Windows環境の場合はShiftJISに変換して渡す必要があります。
「import func_test」で「func_test.pyc」をモジュールとして読み込みます。
「func_test.callShade3D()」でモジュールのメソッド「callShade3D()」を呼んでいます。
「var ret = window.external.setScript(py_src);」を呼ぶことで、Pythonコードを実行します。
結果(return値)は、Python側の”result”に入れた文字列が返されます。
このウィジットを実行すると、ブラウザで選択した形状の名前をメッセージボックスとして表示します。