前提・実現したいこと
コマンドラインから直接blenderを起動し,
その際にオプションとしてpythonスクリプトを指定して
起動と同時にそのpythonスクリプトが実行される実験を行いたかったのですが、blenderの起動後、処理待ちから進展しません。
server.pyはスタンドアロンで動作するサーバで
s_client.pyがblenderに実行させるスクリプトです。
s_client.pyでは,上のほうで,
呼び出される関数run_10_times()を定義しています.
この中で,サーバ(localhostの8823番ポート)にアクセスし,
応答が帰ってきたら立方体を描画するblender専用のbpyコードを実行し,
その後,応答がendであれば終了(Noneをreturn),
そうでなければ10秒待ち(3をreturn)しています.
一番下で,この関数を定期的に呼び出す設定をしています
発生している問題・エラーメッセージ
blenderの起動後、処理待ちから進展しません。
(*bpy. はblender専用コードです)
`
s_client.py
python
1# -*- coding:utf-8 -*- 2import socket 3import errno 4import requests 5from socket import error as socket_error 6 7import bpy 8from random import randint 9 10counter = 0 11 12def run_10_times(): 13 host = "localhost" #お使いのサーバーのホスト名を入れます 14 port = 8823 #適当なPORTを指定してあげます 15 16 client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #オブジェクトの作成をします 17 18 try: 19 client.connect((host, port)) #これでサーバーに接続します 20 except socket_error as serr: 21 print('cannot connect') 22 return None 23 24 massage = "hello" 25 26 client.send(massage.encode('utf-8')) 27 28 response = client.recv(4096) 29 30 print(response) 31 client.close() 32 33 34 number = 1 35 for i in range(0,number): 36 x = randint(-30,30) 37 y = randint(-30,30) 38 z = randint(-30,30) 39 bpy.ops.mesh.primitive_cube_add(location=(x,y,z)) 40 41 global counter 42 counter += 1 43 print(counter) 44 if b'end' in response: 45 print('finished') 46 return None 47 return 3.0 48 49bpy.app.timers.register(run_10_times) 50
server.py
python
1# -*- coding:utf-8 -*- 2import socket 3 4host = "127.0.0.1" #お使いのサーバーのホスト名を入れます 5port = 8823 #クライアントで設定したPORTと同じもの指定してあげます 6 7serversock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 8serversock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 9serversock.bind((host,port)) #IPとPORTを指定してバインドします 10serversock.listen(10) #接続の待ち受けをします(キューの最大数を指定) 11 12while True: 13 14 print('Waiting for connections...') 15 clientsock, client_address = serversock.accept() #接続されればデータを格納 16 17 rcvmsg = clientsock.recv(1024) 18 print('Received -> %s' % (rcvmsg)) 19 if rcvmsg == '': 20 break 21 print('Typa message...') 22 s_msg = input().replace('b', '').encode('utf-8') 23 if s_msg == '': 24 break 25 26 clientsock.sendall(s_msg) #メッセージを返します 27 clientsock.close() 28
試したこと
初めはpcのスペックの問題かと思い、表示するオブジェクトをもっとも簡単なcubeに変更しましたが、いくら待っても blenderの起動後、処理待ちになってしまいました。
追記 cubeの表示はできていました(2020年1月7日16:32)
補足情報(FW/ツールのバージョンなど)
python ver2.8
使用中のpc MacBook Pro (13-inch, 2019, Two Thunderbolt 3 ports)
プロセッサ 1.7 GHz Intel Core i7
メモリ 16 GB 2133 MHz LPDDR3
グラフィックス Intel Iris Plus Graphics 645 1536 MB
あなたの回答
tips
プレビュー