2010-10-26 493 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