<<Tips
BlenderでWebサーバー立てたお話(ネタ)
Blender上からWebサーバーを立てたお話でも。まあ、すべてはPython様のおかげで、たまたま実行したのがBlender搭載のPythonエンジン上だった、というとんでもなくつまらないお話。
ふっ、Blender上からWebサーバー立てちまったぜ… pic.twitter.com/aHdPkgpoiY
— BLUGjp (初芯者) (@blug_jp) April 10, 2015
なお、"Pythonで1行Webサーバ"で検索すると
$ python -m SimpleHTTPServer
コンソールから上記を実行するだけでWebサーバーになるというあら不思議な記事がたくさん引っかかりますね。それと同じようなことをしていると思っていただければそれで。
バッテリー同梱(batteries included)なPythonだからできたこと。
そう、Pythonのライブラリに完全に「おんぶにだっこ」状態ですね。(Blenderのリリース版はPythonをエンジンとして、Python標準ライブラリを含む形で配布されています。)
今回のは素のPythonで書いた http.server.SimpleHTTPRequestHandler クラスの使い方のサンプルをほぼそのままいただいちゃっているわけですし。
サンプルを引用しておきますね。
import http.server
import socketserver
PORT = 8000
Handler = http.server.SimpleHTTPRequestHandler
httpd = socketserver.TCPServer(("", PORT), Handler)
print("serving at port", PORT)
httpd.serve_forever()
では、Blender向けに何かしたか、というと、「上記の行をクラス内関数にして、スレッドとして実行した」、これだけです。上記のスクリプトをBlender上でそのまま実行すると、Blenderが固まって、プログラムの強制終了しか手がなくなります。そこで「別スレッドで動かす」ということになります。まあ、よくわからなかったら「そんなものだ」的に考えてもらえれば。
スレッド対応したのがこちら。こちらも threading パッケージを使うことで少ない行で記述できました。ポイントとしてはsetDaemon関数を書いているところかな?
こちらがサンプル。(pasteall.orgへのリンク)
import threading
import time
from http.server import HTTPServer, SimpleHTTPRequestHandler
host = 'localhost'
port = 8000
class webserver(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.setDaemon(True)
def run(self):
print("Start.")
httpd = HTTPServer((host, port), SimpleHTTPRequestHandler)
print('serving at port', port)
httpd.serve_forever()
if __name__ == "__main__":
w= webserver()
w.start()
上記をBlenderのテキストエディタで書いて、Run Script ボタンを1回クリックします。終了はBlnderを終了することで。
あと、httpサーバーのホームディレクトリは…OSによって異なるので、スクリプト内にカレントフォルダを変更する命令を書いてしまうといいのかな、と思います。
で、何に使うの?
ローカルでBlender Python API ドキュメントを見る時にjsが有効でないと検索機能が使えないことがあって(あるブラウザですね)、その対処として、さてどうするかなあ、ということでサンプルを書いてみた、そんな感じです。なので目的らしいものは.無いですね…。まあ「スレッド化」することでBlender自体の実行をスクリプトが邪魔をしないようにする、というサンプル的な何かにはなりそうですけれど。
See Also:
- リンク等を貼り付け
コメント
最新を表示する
NG表示方式
NGID一覧