小编tba*_*ker的帖子

使用SWIG动态地将自定义C++异常重新抛出为Python异常

情况

我想使用SWIG为C++ API创建一个Python语言绑定.某些API函数可能会抛出异常.C++应用程序具有自定义异常的层次结构,如下例所示:

std::exception
  -> API::Exception
    -> API::NetworkException
      -> API::TimeoutException
      -> API::UnreachableException
    -> API::InvalidAddressException
Run Code Online (Sandbox Code Playgroud)

期望的行为如下:

  1. 所有异常类型都应该具有匹配的Python类作为包装器.这些包装类应该是有效的Python异常.

  2. 当API调用抛出C++异常时,应该捕获它.的相应Python异常(即包装类被捕捉的C++异常的)应被抛出.

  3. 这应该是一个动态过程:Python 异常类型在运行时决定,仅基于捕获的C++异常的运行时类型.这样,就不需要在SWIG接口文件中描述完整的异常层次结构.

问题和疑问

  1. 包装类不是Python异常.

    虽然SWIG为所有自定义异常(如任何其他类)创建包装类,但这些类不是Python异常.基本异常的包装器(API::Exception在示例中)扩展Object而不是BaseExceptionPython类,其中应该派生Python中的所有异常.

    此外,似乎不允许SWIG手动添加父类.请注意,通过使用SWIG与Java一起使用时可以这样做%typemap(javabase)(有关详细信息,请参阅SWIG文档).

  2. Python C API如何抛出用户定义的异常?

    从Python C API抛出Python异常的最常见方法是调用PyErr_SetString [reference].这也显示在下面的演示应用程序中.

    但这对于Python的标准(内置)异常来说是微不足道的,因为对它们的引用存储在Python C API 中的全局变量[ reference ]中.

    我知道有一个方法PyErr_NewException [引用]来获取对自定义异常的引用,但我没有得到这个工作.

  3. Python C API如何在运行时评估C++类型,然后按名称查找相应的Python包装类?

    我假设可以通过Python C API 的反射部分在运行时按名称搜索Python类.这是要走的路吗?它是如何在实践中完成的?

演示应用程序

为了试验这个问题,我创建了一个带有单个函数的小型C++ API,用于计算数字的阶乘.它具有最小的自定义异常层次结构,仅包含一个类TooBigException …

c++ python reflection swig exception

22
推荐指数
2
解决办法
2945
查看次数

Tycho和Eclipse:如何在Eclipse中的开发时将OSGI依赖关系解析为我自己的bundle,而无需在IDE中打开所有这些依赖关系

背景

我的Eclipse RCP应用程序是使用Tycho构建的.它由多个组件组成(以OSGi包/ Eclipse插件的形式).其中一个组件包含产品文件并实现产品.

应用程序根目录下有一个reactor POM,它按顺序构建所有组件,但我也想独立构建其他组件(使用mvn deploy).

构建这样的单个组件的工作原理如下:

  1. 从我们公司(p2)存储库中检索所有组件依赖项的最新版本.
  2. 构建组件.
  3. 将组件部署到我们的公司存储库,以用作其他组件本身的依赖项.

注意:我们的存储库是托管在Nexus上的普通maven2存储库,其RCP工件也自动映射到p2存储库格式.这样,Tycho可以使用p2存储库格式来查找依赖项,而可以使用标准的Maven部署.这很好用.

注意:我的父POM确保我们在p2存储库URL中查找依赖项.部署URL是存储库的默认maven2格式位置.这很好用.

问题

当通过命令行(mvn deploy)构建这样的单个组件时,Maven 在p2存储库中查找项目内依赖项并正确解析它们(即最新版本会自动下载并在构建中使用).

但是,在Eclipse中进行开发时,IDE无法解析它们.清单文件在我的每个项目内依赖项中都会出现错误,导致无法解析这些错误.

我的问题是:如何让Eclipse IDE在以下任何一个中查找依赖项(以及新版本的依赖项):

  • 我的本地p2存储库(~/.m2/repository/p2/osgi/bundles)
  • 我的公司p2仓库(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 osgi eclipse-rcp tycho maven

10
推荐指数
2
解决办法
6673
查看次数

Tycho:单独构建插件时无法解决对项目其他插件的依赖性

我有一个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 osgi artifactory tycho maven

9
推荐指数
1
解决办法
6862
查看次数

Windows上的Java:测试Java应用程序是否作为提升的进程运行(具有管理员权限)

情况

我有一个(基于Eclipse RCP)Java应用程序在多个平台上运行.除了Windows之外,我在所有平台上都弄明白了.

安装程序:我的应用程序安装程序始终以提升模式运行,因此可以将应用程序安装到C:\Program files\MyProduct.从用户角度来看,这意味着安装程序只能由管理员执行,UAC将要求确认.这很好用.

正常使用:普通用户可以启动应用程序.不需要管理员权限.这很好用.

自动更新:自动更新功能也会写入C:\Program Files\MyProduct,因此也需要管理员权限.这就是为什么应用程序虽然可以作为普通应用程序启动,但必须作为升级过程运行以自动更新.从用户的角度来看,它应该是" 以管理员身份运行 "来自动更新.

我想进行运行时检查以查看我的Java进程是否处于提升模式(即查看它是否是' 以管理员身份运行 '.

请注意,它可能是仅限Windows的解决方案.使用Java反射API,我可以在运行时检查Windows和/或特定于实现的类.

研究

我只在StackOverflow上找到了这个问题: 检测Java应用程序是否作为Windows管理员运行

但是,该解决方案将返回活动用户是否为Administrator组的成员.用户可能仍然以非提升模式启动我的应用程序.我已经证实了这一点.

注意

我知道Eclipse RCP应用程序会在用户目录中自动安装更新,当他或她没有管理员权限时,我想阻止这种情况.

我想允许特定于用户的配置(工作正常),但允许用户特定的更新将在卸载后留下太多混乱.

java windows privileges administrator eclipse-rcp

5
推荐指数
2
解决办法
3435
查看次数

Eclipse EMF:自定义XML反序列化,以便将旧项目加载到修改后的模型中

情况

我有一个Eclipse RCP应用程序,用于管理EMF模型中的应用程序项目.

通过将它们序列化为XMI格式来保存这些项目.然后可以将这些文件加载​​回模型中.我使用标准的EMF工具(例如Resource).

由于模型重构,以下内容已更改:

  • 旧模型
    • MyClass带有属性的EClass Name(带大写字母).
    • XMI: <MyClass Name="My Class Name 1" ... />

  • 新模式
    • EClass MyClass继承自MyBaseClass,带属性name(没有大写字母).
    • EClass MyClass不再具有Name属性,因为EMF不允许这两者.这是有意义的,因为它会碰到例如getter方法getName().

问题

如何将旧的 XMI项目文件加载到我的模型中?

直到这个问题,我能够:

  • 避免修改模型
  • 增加模型以包含旧结构和新结构,并加载项目文件执行修改:将信息从旧类型移动到新类型,更新引用,....

但是,在这种情况下,我无法首先加载XMI文件:模型name一方面未命中属性,另一方面无法识别(因而忽略)属性Name.

实现此向后兼容性支持的正确位置是什么?

我假设我应该处理反序列化过程或XML映射.

解决方案的约束是:

  • <MyClass name="..." ... />必须正确加载新项目(包含).
  • 保存(即序列化)项目模型应始终以新格式进行!

java eclipse-rcp eclipse-emf emf

5
推荐指数
1
解决办法
520
查看次数