为什么我可以从 IronPython 访问此 API 而不是 Python.NET?
Why can I access this API from IronPython but not Python.NET?
我正在做一个使用 Tekla EPM Open API 的项目。
我使用 IronPython 与它交互没有任何困难,但使用 Python.NET 时运气不佳,我更喜欢它,因为它与其他模块的兼容性更好。
API 文档指出:
There is only one function in the dll file that can be called. The c-style declaration is:
char *_FabSuiteXML( char * );
因此,以下(混淆)代码在 IronPython(3.4.0a1,.NET Framework 4.8.4360.0(64 位)在 win32 上的 .NETFramework v4.6)中按预期工作:
import clr
import sys
sys.path.append('[…]\Tekla\Tekla EPM')
clr.AddReference("FabSuiteAPI")
import FabSuite
interface = FabSuite.FabSuiteAPI.FabSuiteAPI()
connection_string = '''
<FabSuiteXMLRequest>
<Connect>
<IPAddress>XXX.XXX.X.XX</IPAddress>
<PortNumber>XXX</PortNumber>
<Username>XXXXXX</Username>
</Connect>
</FabSuiteXMLRequest>'''
connection_response = interface.FabSuiteXML(connection_string)
print(interface)
#Yields: <FabSuite.FabSuiteAPI.FabSuiteAPI object at 0x000000000000002B [FabSuite.FabSuiteAPI.FabSuiteAPI]>
print(connection_response)
#Yields:
"""
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<FabSuiteXMLResponse xmlns="http://www.fabsuite.com/xml/fabsuite-xml-response-v0108.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Lang>en</Lang>
<Connect>
<Successful>1</Successful>
<FabSuiteMajorVersion>XXXX</FabSuiteMajorVersion>
<FabSuiteMinorVersion>XXXX</FabSuiteMinorVersion>
</Connect>
"""
然而,在(普通)python (3.9.5) 中使用 Python.NET,我收到错误:
Traceback (most recent call last):
File "[…]\overflow_question_code1.py", line 15, in <module>
connection_response = interface.FabSuiteXML(connection_string)
AttributeError: 'FabSuiteAPI' object has no attribute 'FabSuiteXML'
事实上,python 的 help() 仅显示了 FabSuiteAPI 对象从 System.Object 继承的那些方法。
知道为什么 Python.NET 中没有关键方法吗?
相关但无用的问题:
Python: AttributeError: 'module' object has no attribute 'AddReference'?
Python.NET 2.5 不支持 COM 互操作。这是 tracking issue.
有一个长字workaround using .NET reflection。
顺便说一句,如果 COM 互操作是使用 Python.NET 的原因,那么实际上您最好使用原生 Python COM 客户端库,例如 win32com
我正在做一个使用 Tekla EPM Open API 的项目。
我使用 IronPython 与它交互没有任何困难,但使用 Python.NET 时运气不佳,我更喜欢它,因为它与其他模块的兼容性更好。
API 文档指出:
There is only one function in the dll file that can be called. The c-style declaration is:
char *_FabSuiteXML( char * );
因此,以下(混淆)代码在 IronPython(3.4.0a1,.NET Framework 4.8.4360.0(64 位)在 win32 上的 .NETFramework v4.6)中按预期工作:
import clr
import sys
sys.path.append('[…]\Tekla\Tekla EPM')
clr.AddReference("FabSuiteAPI")
import FabSuite
interface = FabSuite.FabSuiteAPI.FabSuiteAPI()
connection_string = '''
<FabSuiteXMLRequest>
<Connect>
<IPAddress>XXX.XXX.X.XX</IPAddress>
<PortNumber>XXX</PortNumber>
<Username>XXXXXX</Username>
</Connect>
</FabSuiteXMLRequest>'''
connection_response = interface.FabSuiteXML(connection_string)
print(interface)
#Yields: <FabSuite.FabSuiteAPI.FabSuiteAPI object at 0x000000000000002B [FabSuite.FabSuiteAPI.FabSuiteAPI]>
print(connection_response)
#Yields:
"""
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<FabSuiteXMLResponse xmlns="http://www.fabsuite.com/xml/fabsuite-xml-response-v0108.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Lang>en</Lang>
<Connect>
<Successful>1</Successful>
<FabSuiteMajorVersion>XXXX</FabSuiteMajorVersion>
<FabSuiteMinorVersion>XXXX</FabSuiteMinorVersion>
</Connect>
"""
然而,在(普通)python (3.9.5) 中使用 Python.NET,我收到错误:
Traceback (most recent call last):
File "[…]\overflow_question_code1.py", line 15, in <module>
connection_response = interface.FabSuiteXML(connection_string)
AttributeError: 'FabSuiteAPI' object has no attribute 'FabSuiteXML'
事实上,python 的 help() 仅显示了 FabSuiteAPI 对象从 System.Object 继承的那些方法。
知道为什么 Python.NET 中没有关键方法吗?
相关但无用的问题: Python: AttributeError: 'module' object has no attribute 'AddReference'?
Python.NET 2.5 不支持 COM 互操作。这是 tracking issue.
有一个长字workaround using .NET reflection。
顺便说一句,如果 COM 互操作是使用 Python.NET 的原因,那么实际上您最好使用原生 Python COM 客户端库,例如 win32com