2

Python COM サーバーを Ironpython プログラムにインポートすることはできますか?

ここで意味するのは、 を使用して COM サーバーとして登録されwin32com.server.register.UseCommandLine()、 を使用して Ironpython から呼び出されるPython クラス スクリプト (*.py)Activator.CreateInstance(Type.GetTypeFromProgID('python.progid'))です。

私は何度か試みましたが、いつも失敗しました。トレースバックから、Ironpython がスクリプトをインポートするのではなく実行しようとしていることがわかりますが、もちろん失敗しました。私の知る限り、COM オブジェクトとして、スクリプトは Ironpython ではなく Python で実行する必要があります。Ironpython は代わりに出力を使用します。ただし、同じ Activator.CreateInstance() コマンドを使用して、C# から COM サーバーをインポートできます。C# では、COM クラス内のメソッドから値を呼び出し、渡し、取得することができます。

py スクリプトは次のとおりです。

    class TestCom:
        _reg_progid_ =  "TestCom.DisplayText"
        _reg_clsid_ = "{B02B1819-2954-4E47-8E19-570652B38DF2}"

        def __init__(self):
            self.DisplayThis = "Hello from python world"
            self.aText = ""

        def DeliverText(self, aText):
            "say hello"
            if aText <> "": self.DisplayThis = aText
            return self.DisplayThis

    if __name__=='__main__':
        import sys
        sys.path.append(r'C:\Python27')
        sys.path.append(r'C:\Python27\Lib')
        sys.path.append(r'C:\Python27\Lib\site-Packages')
        print "Registering COM server..."
        import win32com.server.register
        win32com.server.register.UseCommandLine(TestCom)

そして、これがIronpythonからのコマンドです(エラーあり):

    >>>from System import Type, Activator
    >>>o = Activator.CreateInstance(Type.GetTypeFromProgID('TestCom.DisplayText'))
    pythoncom error: PythonCOM Server - The 'win32com.server.policy' module could not be loaded.

    Traceback (most recent call last):
      File "C:\Python27\Lib\site-Packages\win32com\__init__.py", line 5, in <module>

        import win32api, sys, os
    ImportError: No module named win32api
    pythoncom error: CPyFactory::CreateInstance failed to create instance. (80004005)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    EnvironmentError: System.Runtime.InteropServices.COMException (0x80004005): Creating an instance of the COM component with CLSID{B02B1819-2954-4E47-8E19-570652B38DF2} from the IClassFactory failed due to the following error: 80004005.
       at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)
       at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache)
       at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache)
       at System.Activator.CreateInstance(Type type, Boolean nonPublic)
       at System.Activator.CreateInstance(Type type)
       at Microsoft.Scripting.Interpreter.FuncCallInstruction`2.Run(InterpretedFrame frame)
       at Microsoft.Scripting.Interpreter.Interpreter.Run(InterpretedFrame frame)
       at Microsoft.Scripting.Interpreter.LightLambda.Run4[T0,T1,T2,T3,TRet](T0 arg0, T1 arg1, T2 arg2, T3 arg3)
       at System.Dynamic.UpdateDelegates.UpdateAndExecute3[T0,T1,T2,TRet](CallSite site, T0 arg0, T1 arg1, T2 arg2)
       at Microsoft.Scripting.Interpreter.FuncCallInstruction`6.Run(InterpretedFrame frame)
       at Microsoft.Scripting.Interpreter.Interpreter.Run(InterpretedFrame frame)
       at Microsoft.Scripting.Interpreter.LightLambda.Run4[T0,T1,T2,T3,TRet](T0 arg0, T1 arg1, T2 arg2, T3 arg3)
       at IronPython.Compiler.Ast.CallExpression.Invoke1Instruction.Run(InterpretedFrame frame)
       at Microsoft.Scripting.Interpreter.Interpreter.Run(InterpretedFrame frame)
       at Microsoft.Scripting.Interpreter.LightLambda.Run2[T0,T1,TRet](T0 arg0, T1 arg1)
       at IronPython.Compiler.PythonScriptCode.RunWorker(CodeContext ctx)
       at IronPython.Compiler.PythonScriptCode.Run(Scope scope)
       at IronPython.Hosting.PythonCommandLine.<>c__DisplayClass1.<RunOneInteraction>b__0()

ところで、IronPython と Python は初めてです。私は両方に 2.7 バージョンを使用しています。

助けてくれてありがとう。

4

0 に答える 0