情况
我想使用SWIG为C++ API创建一个Python语言绑定.某些API函数可能会抛出异常.C++应用程序具有自定义异常的层次结构,如下例所示:
std::exception
-> API::Exception
-> API::NetworkException
-> API::TimeoutException
-> API::UnreachableException
-> API::InvalidAddressException
Run Code Online (Sandbox Code Playgroud)
期望的行为如下:
所有异常类型都应该具有匹配的Python类作为包装器.这些包装类应该是有效的Python异常.
当API调用抛出C++异常时,应该捕获它.的相应Python异常(即包装类被捕捉的C++异常的)应被抛出.
这应该是一个动态过程:Python 异常类型在运行时决定,仅基于捕获的C++异常的运行时类型.这样,就不需要在SWIG接口文件中描述完整的异常层次结构.
问题和疑问
包装类不是Python异常.
虽然SWIG为所有自定义异常(如任何其他类)创建包装类,但这些类不是Python异常.基本异常的包装器(API::Exception在示例中)扩展Object而不是BaseExceptionPython类,其中应该派生Python中的所有异常.
此外,似乎不允许SWIG手动添加父类.请注意,通过使用SWIG与Java一起使用时可以这样做%typemap(javabase)(有关详细信息,请参阅SWIG文档).
Python C API如何抛出用户定义的异常?
从Python C API抛出Python异常的最常见方法是调用PyErr_SetString [reference].这也显示在下面的演示应用程序中.
但这对于Python的标准(内置)异常来说是微不足道的,因为对它们的引用存储在Python C API 中的全局变量[ reference ]中.
我知道有一个方法PyErr_NewException [引用]来获取对自定义异常的引用,但我没有得到这个工作.
Python C API如何在运行时评估C++类型,然后按名称查找相应的Python包装类?
我假设可以通过Python C API 的反射部分在运行时按名称搜索Python类.这是要走的路吗?它是如何在实践中完成的?
演示应用程序
为了试验这个问题,我创建了一个带有单个函数的小型C++ API,用于计算数字的阶乘.它具有最小的自定义异常层次结构,仅包含一个类TooBigException …
我的Eclipse RCP应用程序是使用Tycho构建的.它由多个组件组成(以OSGi包/ Eclipse插件的形式).其中一个组件包含产品文件并实现产品.
应用程序根目录下有一个reactor POM,它按顺序构建所有组件,但我也想独立构建其他组件(使用mvn deploy).
构建这样的单个组件的工作原理如下:
注意:我们的存储库是托管在Nexus上的普通maven2存储库,其RCP工件也自动映射到p2存储库格式.这样,Tycho可以使用p2存储库格式来查找依赖项,而可以使用标准的Maven部署.这很好用.
注意:我的父POM确保我们在p2存储库URL中查找依赖项.部署URL是存储库的默认maven2格式位置.这很好用.
当通过命令行(mvn deploy)构建这样的单个组件时,Maven 在p2存储库中查找项目内依赖项并正确解析它们(即最新版本会自动下载并在构建中使用).
但是,在Eclipse中进行开发时,IDE无法解析它们.清单文件在我的每个项目内依赖项中都会出现错误,导致无法解析这些错误.
我的问题是:如何让Eclipse IDE在以下任何一个中查找依赖项(以及新版本的依赖项):
~/.m2/repository/p2/osgi/bundles)nexus.mycompany.com/myproduct-snapshots/.meta/p2)理想情况下,如果有更新版本,它每次都会查找它们并获取最新版本.
如果它不使用POM中的p2存储库URL,我应该如何配置Eclipse?
考虑一个eclipse插件com.mycompany.myproduct.fancy,它依赖于另一个eclipse插件com.mycompany.myproduct.core.
两者都有一个POM(配置为Tycho使用),它(通过其父POM)正确配置了我的Nexus存储库:部署的maven2存储库URL和查找依赖关系的p2存储库URL.
首先,我将core插件部署到我的maven存储库(使用默认值mvn deploy).Nexus存储库将以maven和p2格式提供此部署的插件.
当我fancy通过命令行(使用mvn install)构建组件时,会自动找到并下载(先前部署的)核心组件.
project/com.mycompany.myproduct.fancy$ mvn clean install
<searches in p2 repository, download core>
<builds fancy>
<SUCCESS>
Run Code Online (Sandbox Code Playgroud)
当我打开一个新的Eclipse工作区并打开该fancy组件时,其Manifest(包含其依赖项)会出现以下错误:
Bundle 'com.mycompany.myproduct.core' cannot be resolved.
Run Code Online (Sandbox Code Playgroud)
我的问题是:如何fancy在Eclipse …
我有一个Eclipse RCP应用程序,它使用Tycho插件与Maven构建.有一个主POM包含所有插件和功能作为模块.
如果我使用Maven 安装主POM,则生成的反应器构建工作正常.所有模块都已构建,安装成功.
但是,如果我单独构建一个Eclipse 插件,则无法解析其与应用程序其他插件的依赖关系.
对第三方库(例如Eclipse平台)的依赖似乎工作正常.我们的应用程序的Eclipse插件只有这种类型的依赖项才能成功构建.
控制台输出如下:
[INFO] Resolving dependencies of MavenProject: com.mycompany.myproduct:com.mycompany.myproduct.gui.editors:1.8.15-SNAPSHOT @ /<path>/com.mycompany.myproduct.gui.editors/pom.xml
[INFO] Cannot complete the request. Generating details.
[INFO] Cannot complete the request. Generating details.
[INFO] {osgi.ws=gtk, osgi.os=linux, osgi.arch=x86, org.eclipse.update.install.features=true}
[ERROR] Cannot resolve project dependencies:
[ERROR] Software being installed: com.mycompany.myproduct.gui.editors 1.8.15.qualifier
[ERROR] Missing requirement: com.mycompany.myproduct.gui.editors 1.8.15.qualifier requires 'bundle com.mycompany.myproduct.preferences 1.8.15' but it could not be found
[ERROR]
[ERROR] Internal error: …Run Code Online (Sandbox Code Playgroud) 情况
我有一个(基于Eclipse RCP)Java应用程序在多个平台上运行.除了Windows之外,我在所有平台上都弄明白了.
安装程序:我的应用程序安装程序始终以提升模式运行,因此可以将应用程序安装到C:\Program files\MyProduct.从用户角度来看,这意味着安装程序只能由管理员执行,UAC将要求确认.这很好用.
正常使用:普通用户可以启动应用程序.不需要管理员权限.这很好用.
自动更新:自动更新功能也会写入C:\Program Files\MyProduct,因此也需要管理员权限.这就是为什么应用程序虽然可以作为普通应用程序启动,但必须作为升级过程运行以自动更新.从用户的角度来看,它应该是" 以管理员身份运行 "来自动更新.
题
我想进行运行时检查以查看我的Java进程是否处于提升模式(即查看它是否是' 以管理员身份运行 '.
请注意,它可能是仅限Windows的解决方案.使用Java反射API,我可以在运行时检查Windows和/或特定于实现的类.
研究
我只在StackOverflow上找到了这个问题: 检测Java应用程序是否作为Windows管理员运行
但是,该解决方案将返回活动用户是否为Administrator组的成员.用户可能仍然以非提升模式启动我的应用程序.我已经证实了这一点.
注意
我知道Eclipse RCP应用程序会在用户目录中自动安装更新,当他或她没有管理员权限时,我想阻止这种情况.
我想允许特定于用户的配置(工作正常),但允许用户特定的更新将在卸载后留下太多混乱.
情况
我有一个Eclipse RCP应用程序,用于管理EMF模型中的应用程序项目.
通过将它们序列化为XMI格式来保存这些项目.然后可以将这些文件加载回模型中.我使用标准的EMF工具(例如Resource).
由于模型重构,以下内容已更改:
MyClass带有属性的EClass Name(带大写字母).<MyClass Name="My Class Name 1" ... />与
MyClass继承自MyBaseClass,带属性name(没有大写字母).MyClass不再具有Name属性,因为EMF不允许这两者.这是有意义的,因为它会碰到例如getter方法getName().问题
如何将旧的 XMI项目文件加载到我的新模型中?
直到这个问题,我能够:
但是,在这种情况下,我无法首先加载XMI文件:模型name一方面未命中属性,另一方面无法识别(因而忽略)属性Name.
题
实现此向后兼容性支持的正确位置是什么?
我假设我应该处理反序列化过程或XML映射.
解决方案的约束是:
<MyClass name="..." ... />必须正确加载新项目(包含).eclipse-rcp ×3
eclipse ×2
java ×2
maven ×2
osgi ×2
tycho ×2
artifactory ×1
c++ ×1
eclipse-emf ×1
emf ×1
exception ×1
privileges ×1
python ×1
reflection ×1
swig ×1
windows ×1