[3850] Re: Pythonの妙なエラー / a
補足なのですがエラー行がおかしかったり、そもそもエラー行が表示されない不明状態だったりするときもあります。再起動するとエラーが変わったりもします。スクリプトは秀丸で上書きしてから、かならず手動で再オープンしています(自動更新されないため)。
添付:頂点周りを連続切断の作りかけ。どうも24行目でエラーってるぽいです。そこをコメントアウトしたり元に戻すと再現できます。
2013-11-28 07:18
[3851] Re: Pythonの妙なエラー / a
もうちょっとわかりやすくスクリプトを書き直しました。
2013-11-28 07:37
[3853] Re: Re: Pythonの妙なエラー / 管理者
>もうちょっとわかりやすくスクリプトを書き直しました。
16行目の
> ti = f.index.index(vi)
は明らかに文法エラーです。
MQFaceクラス内のindexプロパティは数値リストなので
ti = f.index[vi]
としないとエラーになります。
エラーメッセージはPythonのコンパイラが返すものをそのまま表示しています。
内容があまりよくわからないこともありますが、今回のケースではエラー箇所の行は正しく表示されているので、
きちんと確認すれば解決が可能だと思います。
2013-11-28 10:10
[3854] Re: Re: Re: Pythonの妙なエラー / 管理者
改めてよく見ると先に答えた内容は違ってしました。
indexプロパティはPythonの組み込み型のリストではなく独自の型なので、それに対してindexなどの関数は利用できません。
なので、16行目は
for ti in f.numVertex
if f.index[ti] == vi:
MQSystem.println(str(ti))
のように記述する必要があります。
2013-11-28 10:30
[3855] Re: Re: Re: Re: Pythonの妙なエラー / a
独自の型了解しました。
def copy2List(srcList):
retList = []
for v in srcList:
retList.append(v)
return retList
みたいなので回避します。
エラー行がおかしいのが確認できるのは"選択点周りを切断.py"のほうだけです。setudan(v, o)のところに間違って行番がでます。(そもそも出ない場合もあります)
実際のところエラーになっているのはf.index.index(sidx)の部分なのですが、親関数(というかグローバル?コード)の呼出元("setudan(v,0)")がエラーとして表示されます。
2013-11-28 11:23
[3856] Re: Re: Re: Re: Re: Pythonの妙なエラー / 管理者
詳しいことはわからないのですが、forでのループのような入れ子があると当該の行ではなく入れ子の頭に行に
エラー表示されることがあることは以前から確認しています。
ただ、これもPythonが返してきたエラー行番号そのままなので、Pythonを利用しているアプリケーション側ではどうしようもない状況です。
2013-11-28 14:40
[3864] Re: Re: Re: Re: Re: Re: Pythonの妙なエラー / a
↓うるおぼえなので間違っていたら御免なさい
PythonのC++埋め込みAPIのエラー取得APIは腐っています。
確か標準エラー出力か標準出力に普通にPython本体で実行したときと同じエラー表示が流れています(行番号とかエラー内容がより正確)。Blenderはこれを表示しているので、Pythonのエラー行番号やエラー内容がコンソール画面に正確に表示されます。
おそらくVCビルドの設定を"Windowsアプリケーション"ではなく, "コンソール"にしてるのだと思います。(コンソールアプリでもWinAPIは呼び出せるので)。ビルド設定を変えてエントリポイントをちょっと付け替えればPython開発用のMetaseq.exeが作れるのではないかと思うのですがそういうのは無理でしょうか?(ようはコンソール画面が表示されるMetaseq.exe)
現在Pythonスクリプトを開発するときはエラー行がまったくわからない+エラー内容がどれも一緒なので、一行ごとにMQSystem.println()を埋め込むという狂気じみたことをしています。importするモジュールではMQSystemがないので子→孫→ひ孫...とMQSystemをバケツリレーしています(試してないですが、頭にimport MQSystemをつければ良かったのでしょうか?)。正直このままだったら次のプラグインはC++で作ります。
2013-11-29 07:30
[3865] Re: Re: Re: Re: Re: Re: Re: Pythonの妙なエラー / a
もしかしてとおもってMetaseqの0x15C を 0x02 -> 0x03 に変えてコンソールアプリ(になってるのかな?)にしてみましたが、残念ながらコンソールには何も表示されませんでした。上に書いた内容でビルドしてもダメかもしれないです。
随分前なのでよく覚えてないのですが、どっかにはちゃんとしたエラー表示が流れていたと思うのですが・・・。
2013-11-29 07:44
[3866] Re: Re: Re: Re: Re: Re: Re: Re: Pythonの妙なエラー / a
[3889] Re: Pythonの妙なエラー / 管理者
エラー表示を強化したものを試験的に用意してみました。
64ビット版の実行ファイルと差し替えて使用してみてください。
http://metaseq.net/metaseq/metaseq403_x64_pymod.zip
属性エラーに関するメッセージが詳細になったり、入れ子構造内で発生したエラーに対して行番号が正しく表示されると思いますが、
まだテストが不十分なのでうまくエラー表示されないケースがあるかもしれませんので、
お気づきの点があれば引き続きご連絡いただければと幸いです。
2013-12-03 17:30
[3891] Re: Re: Pythonの妙なエラー / a
すごくいいです!ちゃんとエラー内容が正確に表示されています。
行番号はちょっと変ですが、これはBlenderも同じく変だった気がします。(importすると2つのファイル内容が合体して行番号が出てくる感じ)
MQEasy00.pyのratioMQCoordinate、ratioMQColorの引数がratio1としなければいけないのにratio(1が抜けてる)タイポでよくわからないエラーで悩まされたのですが、ちゃんとratio1がdefineされていないと正確なエラーが表示されました。
2013-12-04 10:28
[3894] Re: Re: Re: Pythonの妙なエラー / a
ついでといってはなんなのですが・・・sys.stderrと同じようにstdoutもMQSystem.printlnにリダイレクトしてもらえれば、長いMQSystem.printlnじゃなくてprint()で短く表示できて便利なんじゃないか?と思うのですが実装してもらえないでしょうか?
class StdoutCatcher:
def write(self, stuff):
MQSystem.println(stuff)
catcher = StdoutCatcher()
sys.stdout = catcher
みたいなコードを直前にPyRun_SimpleString?()すればいいんじゃないかと推測するのですが・・・(間違っていたらすみません)
2013-12-04 11:54
[3896] Re: Re: Re: Re: Pythonの妙なエラー / 管理者
>ついでといってはなんなのですが・・・sys.stderrと同じようにstdoutもMQSystem.printlnにリダイレクトしてもらえれば、長いMQSystem.printlnじゃなくてprint()で短く表示できて便利なんじゃないか?と思うのですが実装してもらえないでしょうか?
実はご提示いただいた方法そのままのものを既に組み込んでありますのでお試しください。
次のリリース(4.0.4か4.1.0?)で正式に取り入れる予定です。
2013-12-04 12:44
やったー超うれしいです。次バージョン楽しみにしています。
2013-12-04 13:01