问题标签 [f2py]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - 导入 F2Py 模块时如何“捕获”段错误?
一些背景,其相关性可能会波动:
我目前拥有一些 F2Py 库 - 由 F2Py 从一些 Fortran 代码编译的 Python 模块。出于所有意图和目的,您可以将这些模块视为“第三方”;我目前无权访问 Fortran 源代码,也不负责编译过程。
模块本身被导入到我正在帮助开发的程序中,该程序具有 Python 脚本支持并在多个平台上运行。
我试图防止将来由于编译机器上的库版本和用户机器不同步而导致的兼容性问题引起的崩溃。一个问题已经发生,我们用户的一台机器已更改为不兼容的 numpy 版本,这导致在导入模块时启动时出现不可接受的 seg 错误。
问题:
我正在寻找一种导入 F2Py 模块的方法,但是这样我就可以处理由于模块可能依赖的库版本不兼容而可能发生的任何 seg 错误。我目前在调用导入之前检查 numpy 版本,但我宁愿先导入,然后再“捕获”任何问题:
是否有可能捕获 seg 错误 -特别是由于导入而导致的错误?
python - 子程序参数未正确从 Python 传递到 Fortran
我正在使用 f2py 编译一个供 Python 脚本使用的数值模块。我已将代码简化为以下最小示例:
fd.f:
次.f:
重新运行.py:
用于编译运行的命令如下(注意我是cmd
在windows下使用的):
输出是:
我的第一个猜测是,th
不知何故没有正确地从reprun.py
to subroutine传递itimes
。但是,我不理解这种行为,因为代码的完整版本包括其他输入,所有这些都正确传递。从 Fortran 调用 itime 时,我无法让它做同样的事情,所以我假设它与 Python/Fortran 接口有关。谁能提供有关为什么会发生这种行为的任何见解?
编辑:th = 200
用reprun.py 替换产生th = 200.0
以下输出:
python - f2py 给出“'foo'的重新定义......以前的定义在这里”
这是我的第一个问题,所以对我好一点。
我正在使用 numpy 1.6.1 中的 f2py。我有一个包含几个子例程的 fortran 模块,这些子例程可以很好地编译(和工作)。但是,其中之一使用 erf(x) 函数,它是 GNU 扩展。对于我的目的来说它不够准确,所以我正在尝试使用外部 erf 实现。
我正在尝试使用 fortran 77 中的 Numerical Recipes 中的一个 - 我已将所有相关函数复制到一个名为“erf.f”的文件中,该文件与我的模块位于同一文件夹中。我include 'erf.f'
在模块文件的顶部使用。我将 erf 函数的实际名称更改为“derf”,因此它不会与 gfortran erf 扩展名发生冲突。
但是,当我尝试通过 f2py 编译时,foo
'erf.f' 中的每个函数都会出现错误
错误:“foo”的重新定义错误:“foo”的先前定义在这里
当我查看提到包含重新定义和先前定义的 c 文件时,似乎该函数确实存在两次。我只是不知道为什么?
有人知道如何解决这个问题吗?干杯。
编辑:我没有提到(因为我认为这是不必要的额外信息)numpy distutils 正在使用 f2py 来创建扩展。我现在提到它的原因是我发现我可以使用 很好地创建扩展f2py -c my_module.f90 -m mod
,但是在运行时python setup.py install
我得到了上面详述的错误。那么 f2py 在通过 distutils 运行时有什么不同呢?
编辑#2:如果我将外部 erf 函数文件的所有内容放入与我的模块相同的文件中,那么一切正常。我真的不想这样做,因为展望未来,我将拥有一个巨大的文件,但它现在可以工作,直到我得到这个问题的答案。
python - 如何通过 numpy distutils 链接到 FORTRAN 库
链接到 FORTRAN 库时,我的 setup.py 脚本无法正常工作。
我几乎没有使用图书馆的经验,所以我可能会使用不正确的术语。我有一个使用 FMLIB fortran 包的 fortran 模块。FMLIB 包包含三个我已编译为 .o 文件的 f95 文件。该模块又被 python 模块使用。在 setup.py 文件中,我使用扩展名:
但是,当我尝试安装时,它说它不能使用 FMZM,因为找不到 .mod 文件。我应该在 Extension 中使用不同的关键字来链接到库,还是链接到 mod 文件?或者还有什么我应该做的吗?distutils 的文档相对较少。
python - f2py -- 防止数组重新排序
我有一个数组,它通过 f2py 从 fortran 子例程中读取为一维数组。然后在 python 中,该数组被重塑:
现在我想将该数组作为 3D 数组传回 fortran。
问题是 f2py 在传递给 fortran_routine 之前一直试图转置 a。fortran 例程如下所示:
如何防止所有来回转调?(我很高兴在两种语言中使用不同的数组索引约定)。
编辑
似乎np.asfortranarray
或np.flags.f_contiguous
应该在解决方案中包含某些部分,我似乎无法弄清楚那是什么部分(或者可能是 aravel
后跟 a reshape(shape,order='F')
?
编辑
看来这篇文章引起了一些混乱。这里的问题是f2py
试图保留索引方案而不是内存布局。因此,如果我有一个带有 shape 的 numpy 数组(按 C 顺序)(nz, ny, nx)
,那么 f2py 会尝试使该数组也具有(nz, ny, nx)
fortran 中的形状。如果 f2py 保留内存布局,则数组将(nz, ny, nx)
在 python 和(nx, ny ,nz)
fortran 中具有形状。我想保留内存布局。
python - 使用 f2py 将对象数组传递给 Fortran
Fortran 子例程可以将另一个子例程作为参数。
但是来自 python 的对象数组呢?我该如何发送说
arr=[yht,yht,yht]
到 Fortran。我试过了,但失败了。有没有办法做到这一点?
python - 在 python 代码中使用 f2py 模块时的问题
我有一个需要以下编译命令的 FORTRAN 代码
我在 python 中使用 f2py 模块编译了相同的
它无法编译模块。它在'-ffized-format'处给出了一个错误,说无效的文件格式''
请帮忙
python - 调试/分析 python 扩展
我使用出色的 f2py 工具将我的大部分代码编写为 Python 的 Fortran 扩展。然而,有时很难捕捉到内存泄漏,并分析程序(花费最多时间的地方)。
问题是:是否有一些简单的方法可以为 Python 调试和/或配置文件扩展(尤其是 f2py 生成的)?使用 valgrind 似乎很复杂(我使用 MacOsX,并且不想重新编译解释器)。我现在唯一的选择是打印-调试+打印-配置文件,这很耗时。
python - f2py 包装器编译错误:设置数组的形状
我在通过 f2py 编译时遇到问题。我有一个 f90 模块,里面有几个子例程。到目前为止,它一直在编译,以便在 python 脚本中使用。但是,现在当我尝试编译它并构建它时,它会抱怨这个错误:
它还有另外两个错误,但这些只是由于d()
这里没有正确分配造成的。您可以看到它正在编译的文件是 f2py 包装器。更奇怪的是,当我真正查看它指向的包装文件时,第 355 行实际上是:
所以我不知道为什么编译器告诉我分配语句中没有形状说明符。正因为如此,我不知道如何解决它!
请注意,自从上次正确编译后,我对模块进行了一些更改,但发生此错误的数组我根本没有触及,我也没有触及它存在的特定子例程。
python - f2py 的问题:子程序中对模块的未定义引用
我正在尝试用 f2py 编译一个 Fortran f90 文件,以便在 Python 中使用。该文件是从另一个文件调用模块的子程序。该模块基本上是用于分配的。我可以在命令窗口中使用“gfortran my_dec.f90”来编译模块,但是在尝试编译子例程文件时出现错误。这尤其困难,因为我几乎没有使用过 Fortran,而且这是别人的代码。
这是模块和子程序的一部分,因为它很长,包括它的开始和结束:
子程序:
子程序 my_init
当我尝试使用“f2py -c my_init.f90 -m my_init_m”编译子例程文件“my_init.f90”时,我在子例程中收到一大堆消息,关于从模块中引用变量:
然后是错误,对我来说并没有太多启示:
这几天我一直在尝试解决这个问题,包括搜索互联网,但无济于事。有人有想法么?这可能是一个非常简单的问题。谢谢你的帮助。
编辑:如果我将模块复制并粘贴到与子例程相同的文件中,我就可以使用它了,但是让它作为单独的文件使用它们会很好。