f2py:公开“已使用”模块的参数

2024-07-01

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

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

MODULE test
    INTEGER, PARAMETER :: a = 1
END MODULE test

MODULE test2
    USE test
    INTEGER, PARAMETER :: b = 2
END MODULE test2

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

!    -*- f90 -*-
! Note: the context of this file is case sensitive.

python module test ! in
    interface  ! in :test
        module test ! in :test:test.f90
            integer, parameter,optional :: a=1
        end module test
        module test2 ! in :test:test2.f90
            use test
            integer, parameter,optional :: b=2
        end module test2
    end interface
end python module test

! This file was auto-generated with f2py (version:2).
! See http://cens.ioc.ee/projects/f2py2e/

如果我现在编译f2py --fcompiler=gfortran -c test.pyf test.f90 test2.f90我获得 test.so (与运行相同f2py --fcompiler=gfortran -m test -c test.f90 test2.f90无需先创建签名文件)。在 python 中从该库导入会公开 test.test.a 和 test.test2.b,但不会公开 test.test2.a,如下所示:

In [1]: import test

In [2]: print test.test.a
1

In [3]: print test.test2.b
2

In [4]: print test.test2.a
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
/users/solbrig/svn_checkouts/inversion/satmet/branches/solbrig/rootpath/data/users
/GeoIPS/src/test/<ipython-input-4-bffcf464e408> in <module>() 
----> 1 print test.test2.a

AttributeError: a

只是为了说明这一点b从 fortran 的角度来看,test2 中定义正确,以下代码使用 test2 并打印两者b and b:

SUBROUTINE run_test()
    USE test2
    IMPLICIT NONE
    print *, "a = ", a
    print *, "b = ", b
END SUBROUTINE run_test

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

In [1]: import run_test

In [2]: run_test.run_test()
 a =            1
 b =            2

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

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


我已经找到了解决此问题的临时解决方案,但这不是最佳方案。我将继续研究 f2py 源代码,以便我可以更好地理解它并修复代码本身的问题。在那之前,这是我的解决方案,其灵感来自chatcannon 对我发布到 nympy 的 github 的问题的评论 https://github.com/numpy/numpy/issues/3562#issuecomment-24469055.

从临时的角度来看,有多种方法可以解决此问题,包括几种修改 .pyf 文件的方法。我不想修改 .pyf 文件,因为它作为较大包的一部分变得非常麻烦。为了避免这种情况,我在 f90 源代码中添加了 f2py 指令。

以我原来的问题为例:

MODULE test
    INTEGER, PARAMETER :: a = 1
END MODULE test

MODULE test2
    USE test
    INTEGER, PARAMETER :: b = 2
END MODULE test2

只需在 test2 中添加一个 f2py 指令来展示 f2py 如何定义test2.a:

MODULE test
    INTEGER, PARAMETER :: a = 1
END MODULE test

MODULE test2
    USE test
    !f2py integer, parameter :: a  ! THIS EXPOSES `a` in `test2`
    INTEGER, PARAMETER :: b = 2
END MODULE test2

从结果导入test.so正确暴露test2.a:

In [1]: import test

In [2]: print test.test.a
1

In [3]: print test.test.b
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
.../test_solution/<ipython-input-3-798b14f59815> in <module>()
----> 1 print test.test.b

AttributeError: b

In [4]: print test.test2.a
1

In [5]: print test.test2.b
2
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

f2py:公开“已使用”模块的参数 的相关文章

  • 为什么我不能将 addstr() 添加到 pythoncurses 窗口中的最后一行/列?

    使用Python 我尝试使用addstr 将光标位置写入curses 窗口的右下角 但出现错误 ScreenH 2工作正常 但打印在窗口底部的第二行 ScreenH 1根本不起作用 我究竟做错了什么 import curses Screen
  • Scrapy在使用crawlerprocess运行时抛出错误

    我用 python 编写了一个脚本 使用 scrapy 来收集网站上不同帖子的名称及其链接 当我从命令行执行脚本时 它可以完美地工作 现在 我的意图是使用运行脚本CrawlerProcess 我在不同的地方寻找类似的问题 但我找不到任何直接
  • 在Python中使用argparse解析整个JSON

    我正在尝试使用 ARGPARSE 库在一个简单的参数中解析整个 Json 问题是当它遇到儿子内部的不同元素 例如 和 时 它会突然停止 这是测试代码 parse py import argparse parser argparse Argu
  • 从 pexpect 中提取 stderr

    我的问题很简单 我可以吗 expect 使用 pexpect 查看 stderr 上的某些输出 它似乎pexpect spawn 只能用于期望 stdout 上的输出 乌托邦的例子 import pexpect child pexpect
  • 在django中使用pre_save时取消保存模型

    我有一个模型 class A models Model number models IntegerField 但是当我调用 A save 时 我想确保该数字是素数 或其他条件 否则应该取消保存指令 那么如何取消pre save信号接收器中的
  • Python/Excel - IOError: [Errno 2] 没有这样的文件或目录:

    尝试从文件中提取 xlsx 文档并将数据编译到单个工作表中 尽管文件存在但仍收到 IOError 程序如下 loop that pulls in files from folder import os create directory fr
  • ModuleNotFoundError:没有名为“discord_slash”的模块[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 I m trying to install a module called discord slash https py
  • 使用python docx合并word文档

    我有几个单词文件 每个文件都有特定的内容 我想要一个片段来展示或帮助我弄清楚如何在使用 Python 时将单词文件合并到一个文件中docx图书馆 例如 在 pywin32 库中我执行了以下操作 rng self doc Range 0 0
  • Python:控制超时长度

    我在脚本中运行了类似于以下的代码 try s ftplib FTP xxx xxx xxx xxx username password except print Could not contact FTP serer sys exit 如果
  • tqdm 进度条和 colorama 不能一起工作

    我想使用 colorama 但我已经在代码中使用了 tqdm Example import colorama as color import tqdm as tqdm without line it s working print colo
  • 在窗口中定位画布 - Tkinter/python

    有没有办法将画布放置在窗口中并在其周围放置一个框架 我只找到了如何在画布内放置对象 您可以创建一个框架 然后将您的小部件放入其中 f tk Frame c1 tk Canvas f c2 tk Canvas f c1 pack side l
  • 模拟 default=timezone.now 进行单元测试

    我正在尝试为执行大量日期时间操作的 django 应用程序编写单元测试 我已经安装了mock http www voidspace org uk python mock 给 django 打猴子补丁timezone now为了我的测试 虽然
  • 如何使 Selenium WebDriver 不等待整个页面加载

    我正在使用 python 2 7 和 Selenium webdriver for Firefox 我有一个无法解决或在互联网上找到解决方案的问题 我的任务是打开大约 10k 个网页 adsl 路由器 Web 界面 通过 IP 地址 并上传
  • python中1+1可以等于3吗? [复制]

    这个问题在这里已经有答案了 在继续之前 我知道人们应该never做这个 这个问题纯粹是出于教育目的 我进行这个练习是为了更好地理解 python 的内部结构ctypes 以及它们如何工作 我知道在 python 中更改整数的值相对容易 其实
  • Django 和原始 Python 之间的性能

    我想知道使用纯 python 文件制作网页和使用 Django 之间的性能差异是什么 我只是想知道两者之间是否有显着差异 谢谢 Django 是纯Python 因此每个类似语句或表达式的执行时间将是相同的 需要理解的是 在进行 Web 开发
  • 为什么 a.insert(0,0) 比 a[0:0]=[0] 慢很多?

    使用列表的insert函数比使用切片分配实现相同效果要慢得多 gt python m timeit n 100000 s a a insert 0 0 100000 loops best of 5 19 2 usec per loop gt
  • Python:使用用户输入作为类名的类工厂

    我想动态地将类属性添加到超类 此外 我想创建动态继承自该超类的类 并且这些子类的名称应取决于用户输入 有一个超类 Unit 我可以在运行时向其添加属性 这已经有效了 def add attr cls name value setattr c
  • 使用 Python API 创建文件后如何立即从 Google Vault 导出下载文件?

    使用 Python API 我创建了一个导出 如何使用相同的授权服务下载导出中的 zip 文件 创建导出时 我可以看到 cloudStorageSink 的 bucketName 和 objectNames 但是我找不到任何有关如何使用创建
  • 将函数应用于数据帧的每一行

    下面有什么更优雅的实现方式 我想应用一个函数 my function到数据帧 其中数据帧的每一行都包含函数的参数 然后我想将函数的输出写回数据帧行 results pd DataFrame for row in input panel it
  • OpenCV中如何在点之间画线?

    我有一个元组数组 a 375 193 364 113 277 20 271 16 52 106 133 266 289 296 372 282 OpenCV中如何在点之间画线 这是我的代码不起作用 for index item in enu

随机推荐

  • 使用 Kotlin 在 Android 中渲染 PDF

    我已经在使用 Java 的 PDF 上看到了该线程 但找不到任何有关如何使用 Kotlin 执行此操作的信息 有什么方法或者我需要使用Java吗 在 Android 上使用 Java 渲染 PDF 文件 https stackoverflo
  • 构建警告会影响 iOS 应用商店审批流程吗?

    当应用程序正在经历应用程序商店审批流程时 Apple 的人员会检查项目中的警告 还是只检查错误 例如我的很多 NIB 文件上都有这样的警告 不支持的配置 设置了标题但使用系统标识符 这些属性是互斥的 标题将被忽略 这会成为 Apple 拒绝
  • php 字符串与通配符 * 匹配?

    我想提供将字符串与通配符匹配的可能性 Example mystring dir folder1 file pattern dir file stringMatchWithWildcard mystring pattern gt Return
  • 命令行上出现“黄瓜:找不到命令”错误;不过“耙黄瓜”效果很好

    刚刚在我的系统上更新了我的黄瓜宝石 并且在运行我的标记黄瓜功能时遇到了问题 cucumber 命令不再在我的命令行上运行 bash 黄瓜 找不到命令 最初的想法是我的 PATH 没有在 bash login 中正确设置 不过 我认为这里一切
  • Dockerfile:如何根据ubuntu版本设置apt镜像

    在构建 docker 镜像时 可以通过覆盖来设置自定义 apt 镜像 etc apt sources list e g FROM ubuntu focal RUN echo deb mirror mirrors ubuntu com mir
  • 使用工作日和日历日更新表格

    我在 SQL Server 2012 中有一个表 每月手动更新一次 以反映文件预计进入的日期 日期规则已经有值 但预期日期列是手动更新的 如果预计在 BD1 第 1 个工作日 我将更新到该月的第一个非周末 如果预计在 CD1 日历日 1 我
  • 如何搜索来自另一个页面模型的串联名称列表?

    我的项目中有多个模型 但在下面的屏幕中 大多数字段 属性都位于 SecurityLog 模型中 下面是我显示的官员串联列表 除了军官姓名之外 我的搜索和列标题排序功能正常 我很难合并官员姓名 因为该列表来自另一个页面模型 这是我的数据库架构
  • 无法解析“:app@debug/compileClasspath”的依赖关系:无法解析

    新安装的安卓工作室3 1 3在创建新项目并第一次编译时出现奇怪的依赖关系错误 一个相似的question https stackoverflow com questions 46949622 android studio 3 0 unabl
  • 异步等待和获取语法在 React 中不起作用

    这是我的代码 export class App extends Component constructor props super props async fetchSport sport let headers new Headers h
  • Volley ProgressDialog在获取大量数据时卡住/冻结

    这是我的代码 private void downloadSupplyTownData final int townId2 Using Volley Post params to be sent to the server HashMap
  • Spark 应用程序conf中的setMaster与sparkSubmit上的--master标志之间的差异或冲突

    我试图了解运行 Spark 应用程序时设置主属性的重要性 集群位置位于默认端口 7077 我从测试机运行此应用程序 它将访问 s3 存储桶 目前应用程序中的 Spark 配置如下 val sparkConf new SparkConf se
  • 将参数传递给 Bash 函数

    我正在尝试搜索如何在 Bash 函数中传递参数 但出现的总是如何从命令行 我想在我的脚本中传递参数 我试过 myBackupFunction xx function myBackupFunction directory options ro
  • rspec 路由测试和主机

    我发现我可以使用 rspec 测试路由 如下所示 get should route to welcome index 但我有基于主机名或主机名部分的约束以及几个主机名之间的重定向 测试时如何指定主机名 如何使用正确的配置运行测试 我尝试打印
  • MySQL插入固定值和多select结果的数据

    假设我有一个如下所示的表结构 通知表 id receiver id type content time 接收者 ID 来自用户表 用户表 id username 内容和时间来自广播表 广播表 id content time 因此 当我需要插
  • 如何退出git中的提交编辑消息?

    我通常通过输入来提交git commit m initial 默认情况下 GNU nano 编辑器是 ubuntu Gnome 19 04 上 git config editor 中的选择 我不小心提交了我的更改输入git commit输入
  • Oracle Analytics - SQL 查询的分区和排序

    这是在回答另一个用户的问题时出现的question https stackoverflow com questions 261924 how do i compress this oracle resultset into values a
  • 风玫瑰与 ggplot (R)?

    我正在寻找使用 ggplot2 来创建的良好 R 代码 或包 风玫瑰 http en wikipedia org wiki Wind rose显示风的频率 强度和方向 我对 ggplot2 特别感兴趣 因为以这种方式构建绘图使我有机会利用其
  • 为什么动态安装的 vuejs 内容不是根 vue 实例的子组件?

    我加载一些包含自定义组件的 html 并将该内容挂载到父组件中的固定节点 不幸的是 我发现它们之间没有父子关系 因此动态插入的组件派发的事件无法被根vue接收 我创建了一把小提琴 任何帮助或建议都将受到赞赏 http jsfiddle ne
  • 如何使用空手道为 twitter 设置 oauth 1.0 身份验证? [复制]

    这个问题在这里已经有答案了 我正在使用 karate 进行自动化 并且必须使用 oauth 1 0 身份验证 它有 4 个字段 分别是 token tokensecret consumerkey 和consumersecret 我无法用空手
  • f2py:公开“已使用”模块的参数

    我认为这个问题已经在某个地方得到解决 但我花了大量的时间四处寻找答案 包括深入研究源代码 我试图将问题放在第一段中 其余部分显示了问题的基本示例 我正在尝试编译一个包含USE指向另一个更通用的模块的语句 我更愿意将使用的模块分开 以便它可以