Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中获取用于执行使用多线程的进程的实时输出?_Python_Multithreading_Fortran_Fftw - Fatal编程技术网

在python中获取用于执行使用多线程的进程的实时输出?

在python中获取用于执行使用多线程的进程的实时输出?,python,multithreading,fortran,fftw,Python,Multithreading,Fortran,Fftw,我想使用python执行Fortran代码的可执行文件,并打印实时输出。我使用subprocess.Popen查看实时输出,如图所示。当我执行像“du”这样的命令时,我确实会得到实时输出,但是我的Fortran可执行文件只有在运行完成后才会得到输出 我的python脚本的相关部分是: import subprocess as s a=s.Popen('./fortran_with_fft.exe', shell=True, stdout=s.PIPE) for line in iter(a.st

我想使用python执行Fortran代码的可执行文件,并打印实时输出。我使用
subprocess.Popen
查看实时输出,如图所示。当我执行像“du”这样的命令时,我确实会得到实时输出,但是我的Fortran可执行文件只有在运行完成后才会得到输出

我的python脚本的相关部分是:

import subprocess as s
a=s.Popen('./fortran_with_fft.exe', shell=True, stdout=s.PIPE)
for line in iter(a.stdout.readline, ''):
    print line
当我从终端运行可执行文件时,它运行时没有任何错误,并生成预期的输出。从python运行时不会发生同样的情况。Fortran代码使用fftw使用多个线程执行fft计算。我使用16个线程。我的Fortran代码的相关部分是:

nthreads=16
CALL sfftw_init_threads
CALL sfftw_plan_with_nthreads(nthreads)
CALL sfftw_plan_dft_3d(plan,ngrid,ngrid,ngrid,delta,delta,FFTW_BACKWARD,FFTW_estimate)
delta=CMPLX(densitycontr,0.0)
CALL sfftw_execute(plan)

我怀疑不打印实时输出的问题与可执行文件通过fft使用多个线程这一事实有关。有没有办法通过python获得实时输出以执行使用多线程的进程?

下面的可运行代码创建一个子进程并打印每行输出所需的时间。这证明了我们可以在数据到达时输出子程序行

我不知道为什么Fortran程序的工作方式不一样。这不重要,程序是否使用线程也不重要

来源 输出
你的产量有多长?当操作系统检测到写入到管道中时,它可能只是得到缓冲。执行代码需要将近5分钟,并且从终端运行时,它从一开始就一直打印一些内容。对于python,它在完成运行后打印所有内容。我可以从“top”中看到进程正在执行,即使它没有打印任何内容。它的输出可能只是落在管道的缓冲区中。请看,我的输出有很多行,这似乎不是缓冲区问题,我已经尝试过该解决方案('-u')。输出是否用换行符分隔?如果没有,我想readline会一直阅读,直到找到为止。
#!/usr/bin/env python

'''
pping2.py -- run subprocess, process output as it arrives
'''

# adapted from http://stackoverflow.com/questions/2804543/read-subprocess-stdout-line-by-line

import subprocess, time

def test_ping():
    proc = subprocess.Popen(
        'ping -c5 8.8.8.8', 
        shell=True,
        stdout=subprocess.PIPE,
    )
    start = time.time()
    for line in iter(proc.stdout.readline, ''):
        print '{:.2f} {}'.format(time.time()-start, line.rstrip()) 

if __name__=='__main__':
    test_ping()
0.04 PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
0.04 64 bytes from 8.8.8.8: icmp_seq=1 ttl=44 time=37.4 ms
1.04 64 bytes from 8.8.8.8: icmp_seq=2 ttl=44 time=36.1 ms
2.04 64 bytes from 8.8.8.8: icmp_seq=3 ttl=44 time=37.2 ms
3.04 64 bytes from 8.8.8.8: icmp_seq=4 ttl=44 time=36.0 ms
4.04 64 bytes from 8.8.8.8: icmp_seq=5 ttl=44 time=36.2 ms
4.04 
4.04 --- 8.8.8.8 ping statistics ---
4.04 5 packets transmitted, 5 received, 0% packet loss, time 4005ms
4.04 rtt min/avg/max/mdev = 36.080/36.629/37.417/0.609 ms