sru*_*nni 12 python unix fortran stdout
我试图弄清楚如何使用F2PY从我为其生成Python接口的一些FORTRAN代码重定向输出.我试过了:
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
Run Code Online (Sandbox Code Playgroud)
这是在Python中重定向输出的事实上的方法,但在这种情况下似乎不起作用(即,无论如何都会显示输出).
我确实从2002年发现了一个邮件列表帖子,说"有可能从pts设备读取消息,例如ttysnoop就是这样".关于ttysnoop的信息似乎很难在网上找到(我不认为它已经在很多年内更新;例如,谷歌"ttysnoop"的第一个结果只有到tarball,RPM和.deb的死链接),这个OS X端口的请求收到了响应"没有运气,它需要一些我无法创建的特定于linux的特定功能."
我对如何重定向输出的任何建议持开放态度(它不必使用ttysnoop).
谢谢!
nos*_*klo 20
stdin和stdout fds由C共享库继承.
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!"
Run Code Online (Sandbox Code Playgroud)
这是我最近编写并发现有用的上下文管理器,因为我distutils.ccompiler.CCompiler.has_function在处理pymssql时遇到了类似的问题。我也使用了文件描述符方法,但我使用了上下文管理器。这是我想出的:
import contextlib
@contextlib.contextmanager
def stdchannel_redirected(stdchannel, dest_filename):
"""
A context manager to temporarily redirect stdout or stderr
e.g.:
with stdchannel_redirected(sys.stderr, os.devnull):
if compiler.has_function('clock_gettime', libraries=['rt']):
libraries.append('rt')
"""
try:
oldstdchannel = os.dup(stdchannel.fileno())
dest_file = open(dest_filename, 'w')
os.dup2(dest_file.fileno(), stdchannel.fileno())
yield
finally:
if oldstdchannel is not None:
os.dup2(oldstdchannel, stdchannel.fileno())
if dest_file is not None:
dest_file.close()
Run Code Online (Sandbox Code Playgroud)
我为什么创建它的上下文在这篇博文中。我觉得跟你的差不多。
我在 a 中像这样使用它setup.py:
with stdchannel_redirected(sys.stderr, os.devnull):
if compiler.has_function('clock_gettime', libraries=['rt']):
libraries.append('rt')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8635 次 |
| 最近记录: |