社区首页 >问答首页 >Python“打印”在嵌入MPI程序时不起作用

Python“打印”在嵌入MPI程序时不起作用
EN

Stack Overflow用户
提问于 2015-03-30 17:27:37
回答 1查看 1.1K关注 0票数 6

我在C++ MPI应用程序中嵌入了Python3解释器。此应用程序加载脚本并将其传递给解释器。

当我在没有MPI启动器的情况下在1个进程上执行程序时(简单地调用./myprogram),脚本可以正确执行,并且它的"print“语句输出到终端。当脚本出现错误时,我使用PyErr_Print()在C++端打印它。

然而,当我通过mpirun启动程序时(即使是在单个进程上),我没有从python代码中的"print“得到任何输出。当我的脚本有错误时,我也不能从PyErr_Print()得到任何东西。

我猜Python处理标准输出的方式与MPI (这里实际上是Mpich )将进程的输出重定向到启动器并最终重定向到终端的方式不匹配。

有没有办法解决这个问题?

EN

回答 1

Stack Overflow用户

发布于 2018-03-02 19:53:18

我最终也遇到了同样的问题(PyErr_Print不能在mpirun上运行)。回溯(涉及python3的一些gdb )并比较正常工作的部分(./myprogram)和非工作的部分(mpiunpython1 ./myprogram),我最终在_io_TextIOWrapper_write_impl中找到了./Modules/_io/textio.c:1277 (顺便说一句,Python3.6.0)。

两次运行之间唯一的区别是self->line_buffering是1对0(此时self代表sys.stderr)。然后,在pylifecycle.c:1128中,我们可以看到是谁决定了这个值:

代码语言:javascript
代码运行次数:0
复制
if (isatty || Py_UnbufferedStdioFlag)
    line_buffering = Py_True;

因此,MPI似乎在启动程序之前对stderr做了一些事情,这使得它不是tty。我还没有调查在mpirun中是否有一个选项可以将tty标志保留在stderr上...如果有人知道这一点,那将会很有趣(尽管再想一想,mpi可能有很好的理由将他的文件描述符放在stdout&stderr的位置,例如,它的--output-filename )。

有了这些信息,我可以提出三个解决方案(前两个是快速修复,第三个更好):

1/在启动python解释器的C代码中,在创建sys.stderr之前设置缓冲标志。代码变成:

代码语言:javascript
代码运行次数:0
复制
Py_UnbufferedStdioFlag = 1;   // force line_buffering for _all_ I/O
Py_Initialize(); 

这将使Python的回溯在所有情况下都回到屏幕上;但可能会给出灾难性的I/O ...所以只有在调试模式下才是可接受的解决方案。

2/在python (嵌入式)脚本中,在最开始添加以下内容:

代码语言:javascript
代码运行次数:0
复制
import sys
#sys.stderr.line_buffering = True  # would be nice, but readonly attribute !
sys.stderr = open("error.log", 'w', buffering=1 )

然后,该脚本将回溯跟踪转储到此文件error.log。

我还尝试在PyErr_Print()之后添加一个对fflush(stderr)或fflush(NULL)的调用...但这并不起作用(因为sys.stderr有自己的内部缓冲)。不过,这将是一个不错的解决方案。

3/经过进一步的研究,我在

代码语言:javascript
代码运行次数:0
复制
Python/pythonrun.c:57:static void flush_io(void);

它实际上是在此文件中的每个PyErr_Print之后调用的。不幸的是,它是静态的(只存在于该文件中,在Python.h中没有引用,至少在3.6.0中是这样)。我将这个文件中的函数复制到我的程序中,结果证明它完全可以完成这项工作。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29352485

复制
相关文章
在visual Studio2019中配置MPI【MPI】
右击项目->属性,进行配置: VC++目录->包含目录,添加:“D:\Program Files (x86)\MPI1\Include;” (替换为你的安装目录)
来杯Sherry
2023/05/25
1.8K0
在visual Studio2019中配置MPI【MPI】
python-MPI安装命令
Step2:sudo apt-get install openmpi-bin</br>
DuncanZhou
2020/01/21
8440
python: 在图片上 打印中文
我整理的代码模板: # 指定字体文件地址 FONT_FILE_PATH = ... # 转换成PIL src_img = cv2.imread(img_path) img_PIL = Image.fromarray(cv2.cvtColor(src_img, cv2.COLOR_BGR2RGB)) draw = ImageDraw.Draw(img_PIL) # 配置参数 text = "Hello Nanjing !" normal_color, sum_color = (255, 255,
JNingWei
2018/09/27
1.5K0
MPI on Kubernetes
MPI(Message Passing Interface) 是一种可以支持点对点和广播的通信协议,具体实现的库有很多,使用比较流行的包括 Open Mpi, Intel MPI 等等,关于这些 MPI 库的介绍和使用,本文就不多赘述了,各位可以看看官方文档。
runzhliu
2020/08/06
2.2K0
MPI on Kubernetes
laravel-admin列表排序在使用了$grid->model()->latest()后$grid其它加上sortable()可排序的列在排序时不起作用…
laravel 5.4 改变了默认的数据库字符集,现在utf8mb4包括存储emojis支持。如果你运行MySQL v5.7.7或者更高版本,则不需要做任何事情。
全栈程序员站长
2021/11/01
1.4K0
List.append() 在 Python 中不起作用,该怎么解决?
Python 是一种强大而灵活的编程语言,它提供了许多方便的数据结构和操作方法,其中之一就是列表(List)。列表是一个有序的集合,可以包含不同类型的元素,并且可以进行添加、删除和修改等操作。在 Python 中,我们通常使用 List.append() 方法向列表末尾添加元素。然而,在某些情况下,你可能会遇到 List.append() 方法不起作用的问题。本文将详细讨论这个问题并提供解决方法。
网络技术联盟站
2023/06/01
2.7K0
Python协程爬虫,gevent获取网页源码打印pdf实例爬虫
Python协程爬虫的一个简单实例demo,使用了队列来进行数据的传递,协程的使用相比单线程会快,感觉在加大协程线的时候,速度并没有相应的加快,或者说占用的时间并没有想象中的少,可以参照使用,仅供参考和学习使用!
二爷
2021/09/15
5670
python使用smtp在邮件中嵌入图片
在前面学了发送HTML格式的邮件,而我们都知道HTML网页可以嵌入如图片、视频等元素,那我们是否可以在HTML格式的邮件之中嵌入这些内容呢、答案是可以的,但是效果不好。因为,大部分的邮件客户端和服务商都会屏蔽邮件正文的外部资源,像网页中的图片或者视频、音频等都是外部资源。
灯珑LoGin
2022/10/31
2.3K0
python使用smtp在邮件中嵌入图片
使用MPI for Python 并行化遗传算法
專 欄 ❈PytLab,Python 中文社区专栏作者。主要从事科学计算与高性能计算领域的应用,主要语言为Python,C,C++。熟悉数值算法(最优化方法,蒙特卡洛算法等)与并行化 算法(MPI,OpenMP等多线程以及多进程并行化)以及python优化方法,经常使用C++给python写扩展。 blog:http://ipytlab.com github:https://github.com/PytLab ❈ 前言 本文中作者使用MPI的Python接口mpi4py来将自己的遗传算法框架GAFT进行多
Python中文社区
2018/02/01
2.2K0
使用MPI for Python 并行化遗传算法
python mpi4py(并行编程 23)
https://www.cnblogs.com/zhbzz2007/p/5827059.html
用户5760343
2019/07/30
1.6K0
python mpi4py(并行编程 23)
python 并行进程 mpi4py
from mpi4py import MPI comm = MPI.COMM_WORLD rank = comm.Get_rank() print("hello world from process ", rank)
用户5760343
2022/05/13
5400
在非root用户下安装mpi4py
安装mpi4py所需要的依赖包(python2.7版本/Cpython/Openmpi) 1.源码包安装Python2.7版本
DuncanZhou
2020/01/21
1.1K0
在非root用户下安装mpi4py
安装mpi4py所需要的依赖包(python2.7版本/Cpython/Openmpi) 1.源码包安装Python2.7版本
DuncanZhou
2018/09/04
1.8K0
为什么 strace 在 Docker 中不起作用?
在编辑“容器如何工作”爱好者杂志的能力页面时,我想试着解释一下为什么 strace 在 Docker 容器中无法工作。
用户8639654
2021/09/18
6.4K0
前端|在开发web程序时常遇到的错误
在开发Web程序时会不可避免地犯下一些错误,下面将通过观察这些错误出现的现象来学习排除错误的方法,进而排除这些错误。
算法与编程之美
2019/11/07
7310
前端|在开发web程序时常遇到的错误
[常见问题]在Linux下执行Redis命令不起作用.
redis 127.0.0.1:6379> 这个后面无论输入什么命令都没有返回 ok 或者其他的信息,一直保持截图的状态: 解决方法: 在SecureCRT中设置Options-->SessionO
一枝花算不算浪漫
2018/05/18
1.9K0
Python print() 函数,在同一行打印
print() 函数是 Python 中的一个重要函数,因为它用于将 Python 输出重定向到终端或者重定向到文件。
润森
2022/09/22
2.6K0
Python print() 函数,在同一行打印
InfiniBand与MPI
IB(InfiniBand)和 RDMA(Remote Direct Memory Access)是一种高性能网络技术,通常用于加速数据传输。它们不是基于传统的 TCP/IP 协议栈,而是使用自己的协议栈,以实现低延迟、高带宽的数据传输。
用户8891103
2023/09/14
1.9K0
点击加载更多

相似问题

如何在mpi python mpi4py中在“后收集”之前打印“先收集”

13

在MPI_init之前打印

10

运行fortran mpi程序时出错

12

错误: libtool编译MPI程序时

14

MPI -按顺序打印

64
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文