【问题标题】:dll load error in python due to insufficient stack size?由于堆栈大小不足,python 中的 dll 加载错误?
【发布时间】:2011-08-02 19:46:17
【问题描述】:

我有一个 python 代码,它导入由 f2py(来自 fortran 例程)创建的 dll。现在,如果 fortran 中的数组太大,python 程序就会崩溃。我该如何处理?通过增加堆栈大小?还是堆?我试图研究此事,但我仍然不明白如何增加堆栈或者我应该使用堆来代替以及我应该如何做到这一点..??? Python 总是在我尝试导入 dll 的那一行崩溃,即在“import f90_routine”行。也有人提到线程,但我不知道如何使用它们。希望有人可以帮助我!

【问题讨论】:

  • 您确定这是堆栈溢出问题吗?是什么让你认为它是?
  • 请提供有关您正在使用的 python 版本、Fortran 和 C 编译器以及用于生成 DLL 的编译标志的信息。

标签: python fortran


【解决方案1】:

您的基本问题是您在堆栈上存储大量数据。这是一个糟糕的设计,可能与 Fortran 代码的实现方式有关。

大型数组需要存储在堆上并在那里动态分配。要解决这个问题,您需要了解并相应地修改您的 Fortran 代码。

ALLOCATE 关键字是您在 Fortran 90 中创建堆分配数据的方式。但是,许多编译器提供在堆上分配数组的选项,这可能是您目前最方便的途径。

【讨论】:

    【解决方案2】:

    Visual Studio(也许还有 Windows SDK)附带了一个名为 EDITBIN 的实用程序,这正是您想要的。请参阅http://msdn.microsoft.com/en-us/library/xd3shwhf%28v=vs.71%29.aspx 以供参考。

    要检查堆栈大小,请使用

    dumpbin /headers python.exe
    

    并在“可选标头值”下查找“堆栈保留大小”。

    editbin /stack:size_in_bytes python.exe
    

    请注意,您必须将修改后的 Python.exe 分发给所有想要运行您的代码的人。

    【讨论】:

    • 修改后的 Python exe 听起来是一个相当彻底的解决方案!
    • 我不得不在现场为客户做类似的事情,因为 pythonservice.exe(来自 pywin32)使用的堆栈大小比 Python 小,而且我的程序在作为 Windows 服务运行时崩溃。当在 Python 中遇到堆栈溢出时,您并不总是有很多其他选择,而上面的技巧对我来说是救命稻草。请注意,最新版本的 pywin32 应该已修复此问题。
    • 我认为 OP 的问题实际上是堆栈分配的数组太大而无法放在堆栈上。
    • 太棒了!仍然有效。完美的临时解决方案,同时基于 fotran 的软件正在重构以使用堆分配...
    猜你喜欢
    • 2012-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 2017-11-14
    • 2015-11-22
    • 2020-10-23
    • 2010-11-24
    相关资源
    最近更新 更多