问题标签 [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.

0 投票
3 回答
349 浏览

python - 用 f2py 包装的 C 函数只返回零

我正在尝试使用 f2py 包装一个简单的 C 函数。它编译得很好,但函数只返回零。我是 C 的新手,所以我很确定在那里犯了一个愚蠢的错误。

例如 c 文件:

.pyf 文件:

0 投票
0 回答
375 浏览

python - ipython 和 ipython 笔记本之间的奇怪精度差异然后使用带有 f2py 的 fortran 模块

在使用用 f2py 编译的 fortran 模块时,我遇到了 ipython 和 ipython 笔记本之间的奇怪精度差异。

我的 fortran 模块是:

编译:f2py -c -m andre tt.f90

在 ipython 我得到:

这是所需的输出。但是,在 ipython 笔记本中,使用相同的代码,我得到:

我究竟做错了什么?

0 投票
1 回答
841 浏览

python - python和f2py错误-NameError:未定义全局名称'inputUtil'

我使用 f2py (inputUtil.pyd) 在 python 中编译了一个 fortran 代码。我将此函数导入到我的主要 python 代码中,并从字符串中将两个字符(locationAID 和 locationBID)传递给此函数。

这是错误消息:

以下是我的主要 python 代码的一部分:

这是我使用 f2py 转换为 python 的部分 fortran 代码,它显示了传递给此函数的字符:

f2py 工作得很好,所以我认为这不是问题。我只是在学习 python - 我是一个老 Fortran 程序员(从打孔卡的那天开始!)。所以,请回复一些老人可以遵循的东西。

谢谢你的帮助。

打孔爸爸

0 投票
1 回答
486 浏览

python - f2py 函数发布 GIL

当我调用 f2py 包装函数时,全局解释器锁 (GIL) 是否会被释放?

(我很高兴自己尝试发现,但我对 numpy 的来源不够熟悉,不知道从哪里开始寻找)......

澄清一下,对这个问题的一个好的回答要么帮助我知道在 numpy 源中寻找 a 的位置,Py_BEGIN_ALLOW_THREADS 要么它只会让我知道 GIL 是否已发布(最好有一些证据)。

0 投票
3 回答
688 浏览

python - 通过 f2py 对 Python 的 Fortran 扩展:如何分析?

我正在使用通过 f2py(版本 2)编译的 Fortran(gfortran 4.4.7)编写的 Python(2.7.2)扩展。

我可以用 来分析 Python 部分cProfile,但结果没有提供有关 Fortran 函数的任何信息。相反,时间归因于调用 Fortran 函数的 Python 函数。

我已经为我构建的所有 Fortran 对象启用了“-pg -O”标志,以及在 f2py 调用中通过以下方式创建共享对象:f2py --opt="-pg -O"...

任何有关如何获取 Fortran 信息的提示都非常感谢。

如果有人使用类似的设置,使用不同的分析器,我也会感兴趣。

0 投票
3 回答
8632 浏览

numpy - 在 Windows 上使用 f2py 构建 64 位 Python 扩展

我正在尝试使用 Numpy 的f2py.py脚本从 Fortran 源代码构建 Python 扩展。我正在按照http://www.scipy.org/F2PY_Windows网络存档)中的步骤进行操作。我的系统是 Windows 7 64 位,我主要使用 Python 2.7.3 [MSC v.1500 64 位 (AMD64)]。我有 Numpy-MKL 1.7.1,来自http://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy

这是我尝试过的:

  1. 选择 Fortran 编译器。由于我使用的是 64 位 Python,因此需要 64 位 Fortran 编译器。从MinGW-w64,我尝试了一些个人构建。
  2. 打开一个新的cmd.exeshell,并编辑我提取 GCC 编译器的路径,即:
    • set PATH=%PATH%;c:\gnu\mingw64\bin
    • set C_INCLUDE_PATH=C:\gnu\mingw64\include
  3. 使用以下命令尝试f2py.py构建:

    C:\Python27\python.exe C:\Python27\Scripts\f2py.py -c --fcompiler=gnu95 --compiler=mingw32 -lmsvcr90 -m foo foo.f90

输出为(去除 处的噪声线<--snip-->):

请注意,第一次运行时,会生成三个新文件C:\Python27\libs

  • libmsvcr90.a
  • libpython27.a
  • python27.def

我需要安装其他东西吗?我需要提供其他选项f2py吗?更一般地说,是否可以从 GNU 编译器为 MSVC 构建 Python 构建扩展?

0 投票
1 回答
328 浏览

f2py - f2py : 使用 .f90 文件的注释行

将 f2py 与 .f90 文件一起使用时,是否必须使用标志 !f2py 而不是 Cf2py?我使用 intel fortran 编译器,如果我使用 !f2py,它似乎编译为 .pyd 文件。如果我使用 Cf2py,它会失败。谢谢你的帮助。

0 投票
2 回答
780 浏览

python - f2py:模块中常量的奇怪行为

在 Fortran 模块中使用全局常量时,我​​发现 f2py 有一些奇怪的行为。

假设我有一个文件 test.f90,它看起来像

如果我用 f2py 包装这个

并运行

我明白了

这几乎是你所期望的。real 和 real*8 语句的行为方式相同。

对于我的实际项目,我需要使用编译器标志编译我的 Fortran 代码,并指定显式使用双精度。在 Fortran 中,这很好用。当我将上面的代码编译为

我得到结果

这其实很奇怪。全局变量在第一种情况下没有初始化,它的值为零。这是一个错误还是有不同的方法来指定 f2py 中双精度的显式处理?

0 投票
1 回答
1256 浏览

python - 如何通过 setup.py 在 f2py 中仅包含一些模块

我有一段很长的 fortran 代码,其中一些部分我想暴露给 python。它可以从命令行正常工作,与

我希望分发这个,所以我试图让它与 numpy.distutils.core 一起工作。我认为以下应该有效:

不幸的是,这不起作用。有什么建议么?

很抱歉之前没有提供有关错误消息的详细信息。我现在做了我之前应该做的事情并简化了问题。因此,假设我有以下 fortran 代码 add_test.f95 子程序 add_axis2(in, n1, n2, out) integer, intent(in) :: n1, n2 double precision, intent(in) :: in(n1, n2) double精度,intent(out) :: out(n2) integer :: i2 do i2 = 1,n2 out(i2) = sum(in(:,i2)) enddo return end subroutine add_axis2

然后,如果我跑

我得到一个 add_test.so,如果我导入它,它只有 add_axis1。但是,如果我使用 setup.py

并运行

结果 add_test.so 仍然有两个子例程。(这也解释了我之前收到的错误消息;我的较长代码中有部分 f2py 阻塞,在手动 f2py 调用中简单地被跳过)。所以,我想我的问题已经简化为我如何在 setup.py 中确保只制作一些例程。

更详细地查看输出,我看到

所以错误越来越清楚。...确实,通过进一步的谷歌搜索给出了答案;来自 http://cens.ioc.ee/pipermail/f2py-users/2005-July/001125.html 如果我这样做

简单的示例有效,并且通过类似的更改,更复杂的示例也有效...

0 投票
1 回答
1445 浏览

python - f2py:从“使用”模块中公开参数

我假设这个问题已经在某个地方得到解决,但是我花了很多时间四处寻找答案,包括深入研究源代码。我试图把问题放在第一段。其余部分显示了该问题的基本示例。

我正在尝试编译一个包含USE指向另一个更通用模块的语句的模块。我更愿意将使用的模块分开,以便它可以在多个“包”中用作一组通用设置。当我使用 f2py 编译这两个模块时,一切都像从 fortran 端宣传的那样工作,但从 python 端USE似乎被忽略了。如果我允许 f2py 生成签名文件,则该文件包含USE适当的语句,但如果我完成编译并从生成的库中导入,则使用的模块中的参数在包含 use 语句的模块中不可用。以下是说明情况的两个模块:

为了显示我跑的中间步骤f2py -h test.pyf test.f90 test2.f90。生成以下签名文件;请注意,“test2”模块包含“使用测试”:

如果我现在用我编译得到 test.so (与不先创建签名文件的情况下f2py --fcompiler=gfortran -c test.pyf test.f90 test2.f90运行相同)。f2py --fcompiler=gfortran -m test -c test.f90 test2.f90在 python 中从这个库导入会暴露 test.test.a 和 test.test2.b,但不会暴露 test.test2.a,如下所示:

只是为了说明b从 fortran 的角度在 test2 中正确定义的内容,以下代码使用 test2 并同时打印band b

使用“f2py -m run_test -c test.f90 test2.f90 run_test.f90”编译并获得run_test.so后,可以在python中导入run_test并按预期工作:

对此问题的任何帮助将不胜感激。

TL;DR:当包含 a 的 F90 模块USE由 f2py 编译时,它不会将“已使用”模块中定义的参数作为 Python 中的属性公开。