Metasequoia BBS

| New message | Normal | Tree |
Status
Tag
Keyword
[3849] Pythonの妙なエラー "Attribute not found." / a
Done [Question] Response
Pythonで不可解な"Attribute not found."エラーが多発します。
なんとなくMQFaceのindex変数の名前がいけないような気がしますがどう回避すればよいでしょうか?

確認方法:
1. 適当な物体を用意(私は球を用意)
2. 適当な点を1つだけ選択
3. スクリプト実行
File [123.py]
2013-11-28 07:14
[3850] Re: Pythonの妙なエラー / a
補足なのですがエラー行がおかしかったり、そもそもエラー行が表示されない不明状態だったりするときもあります。再起動するとエラーが変わったりもします。スクリプトは秀丸で上書きしてから、かならず手動で再オープンしています(自動更新されないため)。

添付:頂点周りを連続切断の作りかけ。どうも24行目でエラーってるぽいです。そこをコメントアウトしたり元に戻すと再現できます。
2013-11-28 07:18
[3851] Re: Pythonの妙なエラー / a
もうちょっとわかりやすくスクリプトを書き直しました。
File [123.py]
2013-11-28 07:37
[3853] Re: Re: Pythonの妙なエラー / Administrator
>もうちょっとわかりやすくスクリプトを書き直しました。

16行目の
> ti = f.index.index(vi)
は明らかに文法エラーです。
MQFaceクラス内のindexプロパティは数値リストなので
ti = f.index[vi]
としないとエラーになります。

エラーメッセージはPythonのコンパイラが返すものをそのまま表示しています。
内容があまりよくわからないこともありますが、今回のケースではエラー箇所の行は正しく表示されているので、
きちんと確認すれば解決が可能だと思います。
2013-11-28 10:10
[3854] Re: Re: Re: Pythonの妙なエラー / Administrator
改めてよく見ると先に答えた内容は違ってしました。

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の妙なエラー / Administrator
詳しいことはわからないのですが、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
http://mateusz.loskot.net/posts/2011/12/01/python-sys-stdout-redirection-in-cpp/index.html
http://docs.python.org/3/faq/extending.html#how-do-i-catch-the-output-from-pyerr-print-or-anything-that-prints-to-stdout-stderr
ここのコードのstdoutをstderrに変えればもうちょっと正確なエラー内容が取得できてたようなできなかったような記憶があります。
2013-11-29 07:59
[3889] Re: Pythonの妙なエラー / Administrator
エラー表示を強化したものを試験的に用意してみました。
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の妙なエラー / Administrator
>ついでといってはなんなのですが・・・sys.stderrと同じようにstdoutもMQSystem.printlnにリダイレクトしてもらえれば、長いMQSystem.printlnじゃなくてprint()で短く表示できて便利なんじゃないか?と思うのですが実装してもらえないでしょうか?

実はご提示いただいた方法そのままのものを既に組み込んでありますのでお試しください。
次のリリース(4.0.4か4.1.0?)で正式に取り入れる予定です。
2013-12-04 12:44
[3897] Re: Re: Re: Re: Re: Pythonの妙なエラー / a
やったー超うれしいです。次バージョン楽しみにしています。
2013-12-04 13:01