Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.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
使用os.chdir和c/fortran程序的python线程_Python_C_Multithreading_Fortran - Fatal编程技术网

使用os.chdir和c/fortran程序的python线程

使用os.chdir和c/fortran程序的python线程,python,c,multithreading,fortran,Python,C,Multithreading,Fortran,我在用C或FORTRAN代码理解python时遇到了一些麻烦 我有一个Python脚本,它只部署了两个线程,每个线程将进入一个子目录并调用相同的Fortran程序(对于os.system来说同样简单,但是Popen是一样的。我还包括一个C程序来显示相同的问题) 当调用a.out(F77或C)的每个实例时,我希望它们知道它们在哪个CWD中,但10次或20次运行中有1次不知道。所以我认为我的python有问题 使用F77代码运行Python脚本时,我遇到以下错误: CWD\u F:/home/usr

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

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

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

使用F77代码运行Python脚本时,我遇到以下错误:

CWD\u F:/home/usr/F\u fail/2
CWD\u F:/home/usr/F\u fail/2
Fortran运行时错误:无法打开文件“dummy.txt”:文件存在

当用C运行时,有时我会

CWD\U C:/home/usr/f\U fail/2
CWD_C:/home/usr/f_fail/2

下面是我非常简单的python。一件事;当我取消时间注释时。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;
}
#包括
#包括
#定义路径\u MAX\u1024
int main(){
char cwd[PATH_MAX_];
if(getcwd(cwd,sizeof(cwd))!=NULL)
fprintf(标准输出,“CWD\U C:%s\n”,CWD);
返回0;
}
任何帮助或想法都将不胜感激。 干杯
Julia

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


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

由于您已将路径传递给可执行文件,因此打开文件时只需使用路径即可:

   open(unt,file=trim(cwdpath)//'/dummy.txt',status='unknown')

谢谢你的回答!我是否必须理解,线程不能转到任何其他目录?无法将一些有效的python代码放入将由线程调用的函数中?线程没有CWD,只有进程有CWD。一个进程中的所有线程都共享同一个CWD。好吧,我看到了我的误解,举个例子。如果cwd不是None,则子进程的当前目录将在执行前更改为cwd。请注意,搜索可执行文件时不考虑此目录,因此无法指定程序相对于cwd的路径现在我学到了一些东西,JuliaThanks为你欢呼回答,但我的道路上没有空白字符。伊格纳西奥的回答似乎是对我的问题的一个贴切描述