* Pythonマクロ作成環境について [#m201cdc0]
 |RIGHT:|LEFT:|c
 |~ページ|[[OpenOffice.org FAQの登録ページ]]|
 |~投稿者|new_OOo3|
 |~分類|#listbox3(Q&A,faq03,class)|
 |~優先順位|#listbox3(普通,faq03,priority)|
 |~状態|#listbox3(完了,faq03,state)|
 |~カテゴリー|#listbox3(その他,faq03,category)|
 |~投稿日|2010-07-29 23:36:11 (木)|
 |~OS|WindowsXP SP3|
 |~依存するページ||
 |~バージョン|#listbox3(3.2.1,faq03,version)|
 
 //////////バグ対策(以降マッチさせない)
 
 ** メッセージ [#oa9fc40f]
 |LEFT:|c
 |回答ページでは行末に「~」を付加する必要はありません|
 お世話になっております。~
 この度、Pythonマクロにchallangeするべく下記手順にてeclipseを用いたマクロ開発環境の作成を試みました。~
 
 1) eclipse3.6 のDLとInstall~
 DL元URL : http://download.eclipse.org/eclipse/downloads/drops/R-3.6-201006080911/winPlatform.php#EclipseSDK~
 DL file : eclipse-SDK-3.6-win32.zip~
 
 2) pydev pluninの追加 ~
 eclipseの~
 「help」=>「Install new software」~
 にて~
 http://pydev.sourceforge.net/updates/~
 をadd~
 
 3)Pythonの追加~
 eclipseの~
 「help」=>「Install new software」~
 にて~
 http://www.python.org/download/~
 をadd~
 
 4)OpenOffice.orgSDKのDL、Install~
 DL元 : http://download.openoffice.org/other.html#tested-sdk~
 DL File : OOo-SDK_3.2.1_Win_x86_install_en-US.exe~
 
 5)OpenOffice.orgSDK Plugin追加~
 eclipseの~
 「help」=>「Install new software」~
 にて~
 URL : http://cedric.bosdonnat.free.fr/ooeclipseintegration~
 をadd~
 
 その後、eclipseのWorkSpaceを~
 C:\Documents and Settings\user名\Application Data\OpenOffice.org\3\user\Scripts\python~
 に設定。~
 
 更にWindowsのPathに~
 C:\Program Files\OpenOffice.org 3\URE\bin~
 C:\Program Files\OpenOffice.org 3\Basis\program~
 を追加。~
 
 その後PCを再起動してeclipseを起動させて、「unopy.py」を確認しましたところ下図の様に~
 from com.sun.star.script.provider import XScriptContext~
 がErrorとなりました。~
 Error内容は「XScriptContextがimport出来ない」との旨がProblems欄に表示されていますが、netで調べましたが、解決方法が見つかりませんでした。~
 
 #ref(eclipse01.png)~
 
 つきましては、下記項目についてご教示頂けます様お願いします。~
 
 1)eclipseを用いたPythonマクロの作成環境の手順に間違いがあればご指摘願います。~
 2))import errorの修正方法をご教示頂けます様お願いします。~
 3)eclipse以外で容易にpythonマクロのdegugが出来るIDE作成方法があれば教えて下さい。~
 
 宜しくご回答を頂けます様お願いします。~
 
 ----
 ***1-3 について [#he2015cb]
 >はにゃ? (2010-07-30 02:26:25 (金))~
 ~
 1) 環境変数は実行時に設定されるように Run - Run Configurations で Python Run に新しい項目を作成、Environment のタブで指定するといいと思います。~
 URE_BOOTSTRAP も設定しないとエラーが出るはずです。~
 uno.py や unohelper.py がある場所を Project - Properties の PyDev - PYTHONPATH にある External Libraries で指定してもかまいません。~
 ~
 2) 表示されているエラーは実行前から出ているものだと思います。~
 実行前のインポートエラーは PYTHONPATH からモジュールを検索して見つからなければエラーになります。~
 しかし、この場合のように UNO の型をインポートしている場合、uno.py で変更された import ステートメントでなければ動作しません。値の取得は pyuno.pyd (pyuno.so) 内で行われます。~
 実行前に IDE が表示しているこのエラーは修正方法がありません。Java でのように全ての UNO 型をクラスとして定義しているのとは違い、定義せずに動的に生成する方法をとったバインディングなので仕方ありません。~
 ~
 3) http://wiki.python.org/moin/PythonEditors の Python モードのあるエディタ一覧でに IDE も混じっています。たとえば、次のようなものもあります。~
 Eric~
 http://eric-ide.python-projects.org/index.html~
 PyScripter~
 http://code.google.com/p/pyscripter/~
 Netbeans IDE + Python プラグイン~
 
 //
 ***ご回答ありがとうざいました。 [#b8dc3a85]
 >new_OOo3 (2010-07-30 23:27:56 (金))~
 ~
 はにゃ? 様~
 ~
 お世話になっております。~
 ご回答頂いた内容と下記URLを元にPythonマクロの作成が出来ました。~
 [ 参考URL ]~
 URL1 : http://d.hatena.ne.jp/hanya_orz/20100606/p1~
 URL2 : http://absolutearea.blogspot.com/2010/01/openofficeorg-base-python-1.html~
 ~
 しかし、下記sample codeにおいて、どちらもOOoからは問題無く実行出来ますが、sample code2の方はeclipse上でRunするとError Messageが表示されます。~
  ************ sample code 1*******************
  #!~
  # -*- coding: utf_8 -*-~
  ~
  import uno~
  ~
  def helloWorld():~
     desktop = XSCRIPTCONTEXT.getDesktop()
     frame = desktop.getCurrentFrame()
     win = frame.getContainerWindow()
     toolkit = win.getToolkit()
     rect = uno.createUnoStruct("com.sun.star.awt.Rectangle")
     title = "title"
     msg = "Hello World in Python!!"
     msgbox = toolkit.createMessageBox(win, rect, "messbox", 1, title, msg)
     msgbox.execute()
  ~
  g_exportedScripts = helloWorld,~
  ~
  ****************************************
 ~
  ************ sample code 2**************
  # python Marco~
  from com.sun.star.awt import Rectangle~
  ~
  def omsgbox(message):~
  #	"""shows message."""~
 		desktop = XSCRIPTCONTEXT.getDesktop()
 		frame = desktop.getCurrentFrame()
 		window = frame.getContainerWindow()
 		toolkit = window.getToolkit()
 		msgbox = toolkit.createMessageBox(window, Rectangle(), 'messbox', 1, 'Title', message)
 		return msgbox.execute()
  def oHello():~
 	try:
 		otext='Hello World in Python!!'
 		omsgbox(otext)
 	except:
 		pass
  ****************************************
 ~
 Error message 無し(sample code 1)
 #ref(eclipse02a.png)~
 ~
 OOoから実行した結果
 #ref(eclipse02b.png)~
 ~
 Error message 有り(sample code 2)
 #ref(eclipse03a.png)~
 ~
 OOoから実行した結果
 #ref(eclipse03b.png)~
 ~
 つきましては、OOoとは関係無いeclipseの問題かも知れませんが出来れば、eclipseをPythonマクロのdeguggerとして使いたいと考えておりますので、お知恵を拝借させて頂けます様お願いします。~
 
 //
 ***sample code 2 について [#k92e8531]
 >はにゃ? (2010-07-31 01:49:49 (土))~
 ~
 sample code 2 を Eclipse 上から実行するとき、uno.py を先に import していないためにエラーが出ているようです。~
 前述にもありますが、uno.py を import するとデフォルトの import ステートメントが uno._uno_import 関数で置き換えられます。この関数は pyuno モジュールから UNO の型を取得します。__builtin__ から置き換えるためその Python のインスタンス全体に影響します。というわけで、一度でもその Python のインスタンス実行時にどこかのモジュールで uno.py が import された場合、UNO の型をインポートできるようになります。~
 ~
 OOo のマクロとして Python のスクリプトを実行するときについてですが。~
 OOo は OOo のインスタンス一つ当たり Python のインスタンスを内部で一つしか持っていません。Python のスクリプトを実行しようとするとき次のような順序で Python のインスタンスが作成されます。同じコンテキストに対するその言語用のスクリプトプロバイダは再利用されるので初回の動作です。~
 + Python 用のスクリプトプロバイダ css.script.provider.ScriptProviderForPython サービスがタイプデータベースから検索される。~
 + 普通このサービスとして登録されている実装名 org.openoffice.pyuno.LanguageScriptProviderForPython のコンポーネントがあります。このコンポーネントのローダーは com.sun.star.loader.PythonLoader です。~
 + 先にローダーがインスタンス化されます。Python のローダーは二つの部分に分かれています。C++ で書かれた部分と Python で書かれた部分 (pythonloader.py) です。~
 + C++ で書かれたローダーのインスタンスが作成されると内部で Python のインスタンスが作成されます。~
 + 続いて pythonloader.py をインポートします。このモジュールでは uno モジュールをインポートしています。~
 + ローダーが Python のスクリプトプロバイダをインスタンス化します。~
 + 要求に応じてスクリプトを読み込み、実行します。~
 ~
 というわけで、Python のローダーで読み込まれるような Python で書かれた UNO コンポーネントを実装したモジュールや Python で書いたスクリプトを OOo から実行するときには既に import ステートメントが置き換わっています。~
 ~
 sample code 1 の様に uno.create... から取得するようにすればインポート時にはエラーは出ません。が、uno モジュールをインポートする必要になるため特に変わりはありません。~
 
 
 //
 ***ありがとうございます。 [#d8269a95]
 >new_OOo3 (2010-07-31 23:03:27 (土))~
 ~
 はにゃ? 様~
 ~
 お世話になっております。~
 的確なご指摘によってPythonマクロのDebug環境がつくれました。~
 本当にありがとうございます。~
 
 //
 #article