小编Sup*_*ric的帖子

如何从python SWIG包装器中下载c ++对象?

问题:我使用SWIG在python中包装了一些c ++代码.在python方面,我想采用一个包装的c ++指针并将其向下转换为指向子类的指针.我在SWIG .i文件中添加了一个新的c ++函数来执行此向下转换,但是当我从python调用它时,我得到一个TypeError.

以下是详细信息:

我有两个c ++类,Base和Derived.Derived是Base的子类.我有一个第三类,Container,它包含一个Derived,并提供了一个访问器.访问器将Derived作为const Base&返回,如下所示:

class Container {
  public:
    const Base& GetBase() const {
      return derived_;
    }

  private:
    Derived derived_;
};
Run Code Online (Sandbox Code Playgroud)

我使用SWIG在python中包装了这些类.在我的python代码中,我想将Base引用向下转换为Derived.为此,我在swig .i文件中写了一个c ++中的辅助函数,它执行向下转换:

%inline %{
  Derived* CastToDerived(Base* base) {
    return static_cast<Derived*>(base);
  }
%}
Run Code Online (Sandbox Code Playgroud)

在我的python代码中,我称之为向下转换函数:

base = container.GetBase()
derived = CastToDerived(base)
Run Code Online (Sandbox Code Playgroud)

当我这样做时,我收到以下错误:

TypeError: in method 'CastToDerived', argument 1 of type 'Base *'
Run Code Online (Sandbox Code Playgroud)

为什么会发生这种情况?

作为参考,这里是SWIG生成的.cxx文件的相关位; 即原始函数,以及它的python-interface-ified doppelganger:

  Derived* CastToDerived(Base* base) {
    return static_cast<Derived*>(base);
  }

//  (lots of other generated code omitted)

SWIGINTERN PyObject *_wrap_CastToDerived(PyObject *SWIGUNUSEDPARM(self), PyObject *args) …
Run Code Online (Sandbox Code Playgroud)

c++ python swig typeerror downcast

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

计划风格指南

我已经为一个Scheme样式指南做了一些谷歌搜索,但没有提出像C++Google样式指南那样易于引用和具体的东西.到目前为止我发现的最好的是这个家伙.那里的Scheme风格指南是好还是更好?

lisp scheme coding-style

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

在Scheme中实现"Pythonic"地图:坏主意?

在Scheme中,函数(map fn list0 [list1 .. listN])带有限制,列表必须具有相同数量的元素.来自Python,我缺少Python列表推导的自由,它看起来很像map上面,但没有这个限制.

我很想实现一个替代的"my-map",它允许不同大小的列表,遍历所有列表的前N个元素,其中N是最短列表的长度.

例如,让我们num可以10lst(1 2 3).使用my-map,我希望编写如下表达式:

(my-map + (circular-list num) lst)))
Run Code Online (Sandbox Code Playgroud)

得到:

(11 12 13)
Run Code Online (Sandbox Code Playgroud)

我比阅读传统书更容易阅读本书

(map + (lambda (arg) (+ num arg)) lst)
Run Code Online (Sandbox Code Playgroud)

要么

(map + (make-list (length lst) num) lst) 
Run Code Online (Sandbox Code Playgroud)

两个问题:

  • 作为一个方案新手,我是否忽略了限制"地图"的重要原因?
  • 在Scheme或SRFI中是否存在类似"my-map"的内容?我确实看了一下srfi-42,但要么它不是我想要的,要么就是,而且不是很明显.

scheme list-comprehension map-function

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

“\e”是什么意思?

我在 .emacs 配置文件中发现了以下行:

(define-key scheme-mode-map "\e\t" 'scheme-smart-complete)
Run Code Online (Sandbox Code Playgroud)

它将键序列绑定\e\t到 function scheme-smart-complete,但我不知道\e是什么,而且事实证明这是不可能的(即使在周围加上引号也\e无助于搜索)。

什么是\e

escaping dot-emacs

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

如何在CMake中检测sse可用性

在CMakeLists.txt文件中,有没有办法检测可用的最高SSE级别,并将其保存到CMAKE_CXX_FLAGS?换句话说,我希望能够写出如下内容:

FindSSE()  # defines SSE_FLAGS
set(CMAKE_CXX_FLAGS ${SSE_FLAGS})
Run Code Online (Sandbox Code Playgroud)

例如,如果平台支持最高SSE级别3,则FindSSE()会将SSE_FLAGS设置为-msse3.

cross-platform sse build cmake

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

自动调用常用初始化代码,无需创建__init__.py文件

我的项目中有两个目录:

project/
  src/
  scripts/
Run Code Online (Sandbox Code Playgroud)

“src”包含我精心编写的代码,“scripts”包含一次性的 Python 脚本。

我希望所有脚本都将“../src”添加到其 sys.path 中,以便它们可以访问“src”树下的模块。一种方法是编写一个 script/__init__.py 文件,其内容为:

scripts/__init__.py:
  import sys
  sys.path.append("../src")
Run Code Online (Sandbox Code Playgroud)

这可行,但会产生不必要的副作用,即将我的所有脚本放入名为“scripts”的包中。还有其他方法可以让我的所有脚本自动调用上述初始化代码吗?

我可以只编辑 .bashrc 中的 PYTHONPATH 环境变量,但我希望我的脚本能够开箱即用,而不需要用户摆弄 PYTHONPATH。另外,我不喜欢仅仅为了适应这个项目而进行整个帐户范围的更改。

python scripting python-module pythonpath

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

如何在 Python 中获取视频文件的方向

我想将视频文件的帧加载到 numpy 数组中。我希望帧正确直立,这意味着我需要读取视频文件中的方向元数据,并相应地旋转加载的帧。

我有一种加载帧的方法(opencv 的 python 绑定),所以我需要的是一种读取视频文件方向元数据的方法。

我正在尝试使用在 Ubuntu 14.04 机器上运行的 python 读取从我的 iPhone 上记录的 .MOV 文件。

我看过的东西:

  • opencv:无法检查视频方向
  • hachoir-metadata:不显示方向元数据
  • 酶:仅适用于 .mkv 文件,AFAICT。
  • ffmpeg:不再作为 Ubuntu 存储库上的独立可执行文件提供。这是一个破坏者,因为我宁愿手动指定旋转而不是为了获得视频方向而从源代码编译 ffmpeg 的麻烦。
  • PIL,pyexiv:AFAICT,只加载图像文件。

我在 Ubuntu 14.04 机器上运行代码,所以我正在寻找该平台上可用的库或命令行程序。

任何指针将不胜感激。

python video exif metadata orientation

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

在Matplotlib中,如何清除轴的内容而不删除其轴标签?

是否有axes.clear()的替代方法,可在擦除轴内容的同时保持轴标签不变?

上下文:我有一个交互式脚本,该脚本可翻阅一些流图,并使用axis.quiver()对每幅图进行绘制。如果在两次轴调用之间不调用axis.clear(),则每次quiver()调用只会向图中添加更多箭头,而无需先擦除之前添加的箭头。但是,当我调用axes.clear()时,它使轴标签变形。我可以重新设置它们,但这有点烦人。

matplotlib

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

如何在本地缓存 GOOGLEFINANCE 结果?

GOOGLEFINANCE()用来查询一组固定日期的历史美元/英镑汇率。

这工作正常,除了有时GOOGLEFINANCE返回#N/A,无论临时上游原因。发生这种情况时,#REF对于依赖这些汇率的所有单元格,我的电子表格将充满's。在上游数据源固定之前,该工作表是不可读的。这有时可能需要几个小时。

这种情况经常发生并且特别烦人,因为我不使用GOOGLEFINANCE检索时变数据。我只是将其用作历史汇率的静态数据集,因此理论上我根本没有理由刷新数据。

有没有办法在本地缓存的历史汇率在我的床单,并依傍如果这些值GOOGLEFINANCE的回报#N/A

(如果GOOGLEFINANCE改变对历史汇率的看法,自动更新缓存值的奖励积分。)

google-finance google-sheets

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

如何从numpy中的1维数组中提取零维切片

有没有办法从一维数组切割零维子阵列?

例如,如果我有一个N维ndarray arr,则arr[0]返回一个(N-1)维ndarray.

但是,如果我有1维ndarray x,x[0]则不返回0维ndarray,而是返回a numpy.int64,(如果x包含int64s).

最小的例子:

def increment(zero_d_array):
    zero_d_array[...] = zero_d_array + 1

counter = numpy.array(0)  # a zero-dimensional array containing scalar 0
increment(counter)        # success; counter is now 1

counters = numpy.zeros(3, dtype=int)  # [0, 0, 0]
increment(counter[1])    # fails; counter[1] is a numpy.int64, not a 0-D array
Run Code Online (Sandbox Code Playgroud)

我意识到上面的方法可以使用increment(counter[1:2]),但只是因为increment()碰巧适用于0-D和1-D输入.并非所有功能都会如此灵活.

python numpy slice matrix-indexing

4
推荐指数
1
解决办法
421
查看次数