【问题标题】:python thread with os.chdir and c/fortran Program带有 os.chdir 和 c/fortran 程序的 python 线程
【发布时间】:2018-06-24 10:13:52
【问题描述】:

我在用 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 运行时错误:无法打开文件“dummy.txt”:文件存在

当使用 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;
}

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

【问题讨论】:

    标签: python c multithreading fortran


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回答!我是否必须了解,一个线程无法转到任何其他目录?不能将一些有效的 Python 代码放入将由线程调用的函数中?
    • 线程没有 CWD,只有进程有。一个进程中的所有线程共享同一个 CWD。​​span>
    • 好吧,我明白了我的误解,只是阅读例如 linux.die.net/man/2/unshare 。这应该可以工作 child=subprocesse.Popen((FULL/PATH/a.out),....,cwd=newDir,...) docs.python.org/2/library/subprocess.html: "如果 cwd 不是 None , 子进程的当前目录在执行前会被改成cwd。注意搜索可执行文件时不考虑这个目录,所以不能指定程序相对于cwd的路径。”现在我学到了一些东西干杯朱莉娅
    【解决方案2】:

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

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

    【讨论】:

    • 感谢您的回答,但我的路径中没有空白字符。伊格纳西奥的答案似乎与我的问题密切相关
    猜你喜欢
    • 2015-04-28
    • 2013-04-29
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    • 2014-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多