当前位置: 首页 > 面试题库 >

重定向Python中的FORTRAN(通过F2PY调用)输出

帅锦
2023-03-14
问题内容

我试图弄清楚如何从一些FORTRAN代码中重定向输出,我已经使用F2PY为它们生成了Python接口。我试过了:

from fortran_code import fortran_function
stdout_holder = sys.stdout
stderr_holder = sys.stderr
sys.stdout = file("/dev/null","w")
fortran_function()
sys.stdout.close()
sys.stderr.close()
sys.stdout = stdout_holder
sys.stderr = stderr_holder

这是在Python中重定向输出的事实上的方法,但是在这种情况下似乎不起作用(即,无论如何都会显示输出)。

我确实找到了2002年的邮件列表帖子,内容是“可以从pts设备读取消息,例如ttysnoop可以做到这一点”。关于ttysnoop的信息似乎很难在网上找到(我认为它已经有很多年没有更新了;例如,在Google上针对“
ttysnoop”的第一个结果
只有指向tarball,RPM和.deb的无效链接)。
),并且向OS
X发出的端口请求收到响应“运气不好,它需要一些我无法创建的特定于Linux的utmp函数。”

我愿意就如何重定向输出(不必使用ttysnoop)提出任何建议。

谢谢!


问题答案:

C共享库继承了stdin和stdout fds。

from fortran_code import fortran_function
import os

print "will run fortran function!"

# open 2 fds
null_fds = [os.open(os.devnull, os.O_RDWR) for x in xrange(2)]
# save the current file descriptors to a tuple
save = os.dup(1), os.dup(2)
# put /dev/null fds on 1 and 2
os.dup2(null_fds[0], 1)
os.dup2(null_fds[1], 2)

# *** run the function ***
fortran_function()

# restore file descriptors so I can print the results
os.dup2(save[0], 1)
os.dup2(save[1], 2)
# close the temporary fds
os.close(null_fds[0])
os.close(null_fds[1])

print "done!"


 类似资料:
  • 问题内容: 我在玩f2py。我对numpy固有类型和fortran 90类型感到困惑。与python交互时,似乎只能在fortran 90中使用单精度实数。让我用一个例子来说明: 说我有这个fortran 90模块test.f90,可以用f2py编译并导入python中: 我这样编译: f2py -c -m测试test.f90 然后,在python中: IOW,看来f2py不接受双精度。当将输入从

  • Fortran isn't a language the many people write new codes in but it still is in extensive use in the scientific communities. Many, many libraries exist for doing numerical calculation that will never b

  • 问题内容: 我想知道是否有人建议编写一个向后兼容的input()调用来检索文件路径? 在Python 2.x中,raw_input适用于/ path / to / file之类的输入。在这种情况下,对于3.x使用输入可以正常工作,但是由于评估行为,在2.x中会抱怨。 一种解决方案是检查Python的版本,并根据该版本映射或映射到新函数: 我相信有更好的方法可以做到这一点。有人有什么建议吗? 问题答

  • 问题内容: 我在Python中使用脚本来显示控制台进度条。但是,我必须调用将消息也发送到控制台且不能更改的函数。通常,在控制台中显示进度条时写入控制台会使显示混乱,如下所示: 这将创建输出: 根据该方法的文档,提供了一种在不中断显示的进度条的情况下将消息写入控制台的方法。因此,此代码段提供了正确的输出: 看起来像这样: 另一方面,存在这种[解决方案,该解决方案允许通过相当优雅地重定向到void中来

  • 问题 你希望你的脚本接受任何用户认为最简单的输入方式。包括将命令行的输出通过管道传递给该脚本、 重定向文件到该脚本,或在命令行中传递一个文件名或文件名列表给该脚本。 解决方案 Python内置的 fileinput 模块让这个变得简单。如果你有一个下面这样的脚本: #!/usr/bin/env python3 import fileinput with fileinput.input() as

  • 问题内容: 我在命令行中执行的操作: 我想用python做什么: 问题答案: 更新:不鼓励使用,尽管在Python 3中仍然可用。 用途 如果你确实要使用子流程,请使用以下解决方案(大部分内容来自子流程的文档): OTOH,你可以完全避免系统调用: