gpt4 book ai didi

带有 os.chdir 和 c/fortran 程序的 python 线程

转载 作者:太空宇宙 更新时间:2023-11-04 02:27:55 26 4
gpt4 key购买 nike

我在用 C 或 FORTRAN 代码理解我的 Python 时遇到了一些麻烦。

我有一个简单部署两个线程的 Python 脚本,每个线程将进入一个子目录并调用相同的 Fortran 程序(为了与 os.system 相同的简单性,但 Popen 是相同的。我还包括一个C程序显示同样的问题)

当调用 a.out(F77 或 C)的每个实例时,我原以为它们知道它们在哪个 CWD 中,但 10 次或 20 次运行中有 1 次它们不知道。所以我认为我的 python 做错了什么。

使用 F77 代码运行 Python 脚本时出现此错误:

CWD_F: /home/usr/f_fail/2
CWD_F: /home/usr/f_fail/2
Fortran runtime error: Cannot open file 'dummy.txt': File exists

用 C 运行时,有时我得到

CWD_C : /home/usr/f_fail/2
CWD_C : /home/usr/f_fail/2

这是我非常简单的 python。一件事;当我取消注释 time.sleep()它似乎运作良好!

#!/usr/bin/python
import threading, os,time

def t1( newDir ):
os.chdir( newDir )
os.system('../a.out')
os.chdir('..')

def t2( newDir ):
os.chdir( newDir )
os.system('../a.out')
os.chdir('..')

#main starts here
cwd_=os.getcwd()
try :
os.mkdir('1')
except:
pass
try :
os.mkdir('2')
except:
pass

newDir1=os.path.join( cwd_ , '1')
newDir2=os.path.join( cwd_ , '2')
tt1 = threading.Thread( target=t1 , args=(newDir1,))
tt2 = threading.Thread( target=t2 , args=(newDir2,))

tt1.start()
#time.sleep(1)
tt2.start()

tt1.join()
tt2.join()

这里是 FORTRAN77 代码:

     program test
implicit none
integer i,k,unt
real*8 a(3,10 ), c(3)
character*132 fl,cwdpath

do i=1,10
c(1)=i*1.11
c(2)=i*2.22
c(3)=i*3.33
a(:,i)=c
enddo

unt=1
fl='dummy.txt'
call getcwd(cwdpath)
write(*,*) 'CWD_F: ', cwdpath
write(*,*) 'unit: ', unt

open(unt,file=fl,status='unknown')
close(unt,status='delete')

open(unt,file=fl,status='new')
do k=1,10
write(unt,200) a(1,k),a(2,k),a(3,k)
enddo
close(unt)
200 format(' ',F10.4,F10.4,F10.4)
end

或者,这是我的 C 代码:

#include <unistd.h>
#include <stdio.h>
#define PATH_MAX_ 1024
int main() {
char cwd[PATH_MAX_];

if (getcwd(cwd, sizeof(cwd)) != NULL)
fprintf(stdout, "CWD_C : %s\n", cwd);

return 0;
}

任何帮助或想法将不胜感激。干杯! Julia

最佳答案

CWD 是进程范围的,因此发生的情况如下:首先,执行其中一个线程中的 os.chdir(),将进程切换到该目录。然后执行另一个线程中的os.chdir(),将进程切换到另一个目录。然后运行线程中的其余代码。您将需要序列化线程操作以使代码正常工作。

或者,您可以在运行程序之前告诉 shell 更改目录;因为每个 shell 都是一个单独的进程,所以没有冲突的目录更改,之后也不需要返回到父目录。

关于带有 os.chdir 和 c/fortran 程序的 python 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48268789/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com