2010-10-26 494 views
1

我有一个用Fortran 90/95编写的程序;调用后它总是读取某个数据文件。为了方便用户,我希望他们只需将该文件放在与可执行文件本身相同的目录中,而不需要设置某些环境变量/扩展$ PATH,并且不会强制他们为此使用某个目录。该程序应该“简单地”在它自己存储的目录中查找文件,而不是在它所运行的目录中。然而到目前为止,我还没有找到解决这个问题的办法。我试过使用如何使用Fortran获取可执行文件的位置?

getarg(0,path) 

但只给了我任何字符串我曾经调用该程序,而不是它的绝对路径。

如果您有任何建议,也有关变通方法,请不要犹豫,回复。提前感谢!

回答

2

要求该二进制文件位于某个特定的目录中会让我感到奇怪。只要在PATH上找到二进制文件,就可以工作。你可以做的是尝试从当前工作目录读取数据文件,即当启动程序时用户所在的目录。

我不想让用户总是复制周围的数据文件,可以搜索几个“默认”位置,然后使用找到该文件的第一个位置,例如,当前的工作目录,然后是$ HOME/.your_program/file.dat,最后是/usr/local/share/your_program_name/file.dat,或类似的东西。但是,如果你希望继续下去这个错误的路径,至少在Linux上你可以使用readlink()(你可能需要为此创建一个C封装器,请参阅最近的Fortran中的ISO C BINDING编译器)检查/ proc/self/exe符号链接。另外,GETARG不属于Fortran标准的一部分,因此您依赖的是供应商扩展(无可否认,这得到了广泛的支持)。从Fortran 2003开始,执行此操作的标准功能是GET_COMMAND_ARGUMENT内部函数。

+0

亲爱janneb,谢谢你的编辑,这似乎恰好包含我一直在寻找的信息。我不明白的是你的意思是“错误的路径”:我的目标是让用户将可执行文件复制到他们选择的任何目录并让它们从那里运行程序,这有什么错?或者这不是你批评的观点? – canavanin 2010-10-28 07:22:00

0

我认为这是fortran难以解决的问题,我认为你的方法正确(将数据文件放在与可执行文件相同的目录中)。 Fortran语言需要沿东西线蟒的

os.path.dirname(os.path.realpath(sys.argv[0])) 

不幸的是,FORTRAN是I/O和你的问题的亮点只是一个小方面绝对可怕。

为了防万一别人跳枪并认为这是一个微不足道的问题 - 考虑你不知道人们要运行这个可执行文件的操作系统的情况,而且你不知道可执行文件的名字。

我的可能很糟糕的解决方法是使用INDEX查找“/”。如果它返回非零,那么用户“必须”在Linux系统上,所以使用INDEX去除可执行文件的名称,并且已经获得了路径。然后查找“\”,如果INDEX找到某事,则假定OS=windows并剥离可执行文件。

0

canavanin,您是否在此期间找到了解决方案?在g77中getarg(0,path)为可执行文件提供完整路径,但不在gfortran中。然而,gfortran的这个缺点似乎只是Windows特有的。演示getarg在bash shell中的功能的See Here ...

--- corection: 我已经发现问题不是GFORTRAN vs G77,它是特定的版本。 DJGPP(DOS端口)分发版的最新GCC/GFORTRAN版本(4.54)使getarg(0,路径)在[executable] .exe前传递完整路径。分隔符是“/”而不是“\”。

-1

数码视觉Fortran语言(等),在Windows中,我这样做是这样的:

SUBROUTINE GetFullExeName(FULLNAME,L) 


!****************************************************************************** 
! 
! Gets the full name of the current executing program. 
! 
!****************************************************************************** 
     USE DFWIN 
     CHARACTER*(*) FULLNAME   ! full name 
     INTEGER  L     ! length 
     L= GetModuleFileName(NULL,FULLNAME,LEN(FULLNAME)) ! windows API 
     FULLNAME(L+1:) = ' ' 
     END