Path 如何获取可执行文件&x27;使用Fortran的位置?

Path 如何获取可执行文件&x27;使用Fortran的位置?,path,executable,fortran,Path,Executable,Fortran,我有一个用Fortran 90/95编写的程序;调用后,它总是读取某个数据文件。为了方便用户,我希望他们只需将此文件与可执行文件本身放在同一目录中,而不必让他们设置一些环境变量/extend$PATH,也不必强迫他们为此使用某个目录。程序应该“简单地”在其自身存储的目录中查找文件,而不是在其运行的目录中。然而,到目前为止,我还没有找到解决这个问题的办法。我试着用 getarg(0,path) 但这只给了我用来调用程序的字符串,而不是它的绝对路径 如果您对解决办法有任何建议,请随时回复。提前多谢

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

getarg(0,path)
但这只给了我用来调用程序的字符串,而不是它的绝对路径


如果您对解决办法有任何建议,请随时回复。提前多谢

要求二进制文件在某个特定目录中,这让我觉得很奇怪。只要在路径上找到二进制文件,就应该可以工作。相反,您可以尝试从当前工作目录(即启动程序时用户所在的目录)读取数据文件

如果您不想要求用户总是复制周围的数据文件,您可以搜索几个“默认”位置,然后使用找到文件的第一个位置,例如当前工作目录,然后是$HOME/.your_program/file.dat,最后是/usr/local/share/your_program_name/file.dat,或者类似的内容

编辑但是,如果您希望继续沿着这条错误的路径前进,至少在Linux上,您可以使用readlink()(您可能需要为此创建一个C包装,请参阅最近Fortran编译器中的ISO C绑定)来检查/proc/self/exe符号链接


顺便说一句,GETARG不是Fortran标准的一部分,因此您依赖于一个供应商扩展(这是公认的得到广泛支持的)。从Fortran 2003开始,执行此操作的标准功能是GET_COMMAND_内在参数。

要求二进制文件位于某个特定目录中,这让我觉得很奇怪。只要在路径上找到二进制文件,就应该可以工作。相反,您可以尝试从当前工作目录(即启动程序时用户所在的目录)读取数据文件

如果您不想要求用户总是复制周围的数据文件,您可以搜索几个“默认”位置,然后使用找到文件的第一个位置,例如当前工作目录,然后是$HOME/.your_program/file.dat,最后是/usr/local/share/your_program_name/file.dat,或者类似的内容

编辑但是,如果您希望继续沿着这条错误的路径前进,至少在Linux上,您可以使用readlink()(您可能需要为此创建一个C包装,请参阅最近Fortran编译器中的ISO C绑定)来检查/proc/self/exe符号链接


顺便说一句,GETARG不是Fortran标准的一部分,因此您依赖于一个供应商扩展(这是公认的得到广泛支持的)。从Fortran 2003开始,执行此操作的标准特性是GET_COMMAND_参数的内在特性。

我认为这是一个在Fortran中很难解决的问题,我认为您的方法是正确的(将数据文件与可执行文件放在同一目录中)。Fortran需要一些类似python的东西

os.path.dirname(os.path.realpath(sys.argv[0]))
不幸的是,fortran对于I/O来说绝对糟糕,您的问题只突出了一个小方面

如果其他人跳过枪,认为这是一个很小的问题——考虑一下你不知道人们会运行这个可执行文件的情况,而你不知道可执行文件的名称。


我的解决方法可能很糟糕,就是使用索引查找“/”。如果它返回非零,那么用户“必须”在linux系统上,所以使用INDEX去掉可执行文件的名称,就得到了路径。然后查找“\”,如果INDEX找到了什么,那么就假设
OS=windows
并去掉可执行文件。

我认为这是一个用fortran解决的难题,我认为您的方法是正确的(将数据文件放在与可执行文件相同的目录中)。Fortran需要一些类似python的东西

os.path.dirname(os.path.realpath(sys.argv[0]))
不幸的是,fortran对于I/O来说绝对糟糕,您的问题只突出了一个小方面

如果其他人跳过枪,认为这是一个很小的问题——考虑一下你不知道人们会运行这个可执行文件的情况,而你不知道可执行文件的名称。


我的解决方法可能很糟糕,就是使用索引查找“/”。如果它返回非零,那么用户“必须”在linux系统上,所以使用INDEX去掉可执行文件的名称,就得到了路径。然后寻找“\”,如果索引找到了什么,那么就假设
OS=windows
并去掉可执行文件。

canavanin,你同时找到解决方案了吗?在77国集团
getarg(0,path)
中,提供具有完整路径的可执行文件,但不在gfortran中。然而,gfortran的这个缺点似乎只是windows特有的。它演示了getarg在bash shell中的功能

---相互作用:
我现在发现问题不在于GFORTRAN vs G77,而是具体的构建。DJGPP(DOS端口)发行版的最新GCC/GFORTRAN版本(4.54)使getarg(0,path)在[executable].exe前面传递完整路径。分离字符是“/”而不是“\”

卡纳瓦宁,您是否同时找到了解决方案?在77国集团
getarg(0,path)
中,提供具有完整路径的可执行文件,但不在gfortran中。然而,gfortran的这个缺点似乎只是windows特有的。它演示了getarg在bash shell中的功能

---相互作用: 我现在发现问题不在于GFORTRAN vs G77,而是具体的构建。DJGPP(DOS端口)发行版的最新GCC/GFORTRAN版本(4.54)使