Как получить местоположение моего исполняемого файла с помощью Fortran? - PullRequest
1 голос
/ 26 октября 2010

У меня есть программа, написанная на Фортране 90/95;после вызова он всегда читает определенный файл данных.Для удобства пользователей я бы хотел, чтобы они просто поместили этот файл в тот же каталог, что и сам исполняемый файл, не заставляя их устанавливать какую-либо переменную среды / extension $ PATH, и не заставляя их использовать для этой цели определенный каталог.,Программа должна «просто» искать файл в каталоге, в котором он сам хранится, а НЕ в каталоге, из которого он запущен.Однако до сих пор мне не удалось найти решение этой проблемы.Я попытался использовать

getarg(0,path)

, но это дало мне только строку, которую я использовал для вызова программы, а не ее абсолютный путь.

Если у вас есть предложения, в том числе и об обходных путях, пожалуйста,не стесняйтесь отвечать.Большое спасибо заранее!

Ответы [ 4 ]

2 голосов
/ 26 октября 2010

Требование, что бинарный файл находится в каком-то определенном каталоге, кажется мне странным.Пока бинарный файл найден в PATH, все должно работать.Вместо этого вы можете попробовать прочитать файл данных из текущего рабочего каталога, то есть каталога, в котором находится пользователь при запуске программы.

Если вы не хотите, чтобы пользователи всегда копировалиФайл данных вокруг вас может найти несколько мест по умолчанию, а затем использовать первое место, где находится файл, например, текущий рабочий каталог, затем $ HOME / .your_program / file.dat и, наконец, / usr / local / share /your_program_name / file.dat или что-то в этом роде.

Редактировать Если вы, однако, хотите продолжить этот неправильный путь, по крайней мере в Linux вы можете использовать readlink () (вам, вероятно, для этого нужно создать оболочку C, см.Привязка ISO C в последних компиляторах Фортрана) для проверки символической ссылки / proc / self / exe.

Кроме того, GETARG не является частью стандарта Фортрана, поэтому вы полагаетесь на расширение поставщика (которое по общему признанию)довольно широко поддерживается).Начиная с Fortran 2003 стандартной функцией для этого является встроенная функция GET_COMMAND_ARGUMENT.

0 голосов
/ 19 июня 2012

В Digital Visual 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  
0 голосов
/ 19 июня 2011

канаванин, вы нашли решение в это время?В g77 getarg(0,path) поставляет исполняемый файл с полным путем, но не в gfortran.Однако этот недостаток gfortran, по-видимому, относится только к конкретным окнам. См. Здесь , который демонстрирует работу getarg в оболочке bash ...

--- corection: Теперь я обнаружил, что проблема не в GFORTRAN против G77, а в конкретной сборке.Последняя версия дистрибутива GCC / GFORTRAN (4.54) DJGPP (порт DOS) позволяет getarg (0, путь) доставлять полный путь перед [исполняемым файлом] .exe.Символ разделения - «/», а не «\».

0 голосов
/ 01 июня 2011

Я думаю, что это трудная проблема для решения в Фортране, и я думаю, что вы правы в своем подходе (поместите файл данных в тот же каталог, что и исполняемый файл).Фортрану нужно что-то вроде

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

К сожалению, Фортран абсолютно ужасен для ввода / вывода, и ваш вопрос выделяет только одну небольшую грань.

На всякий случай, если кто-то еще бросит пистолети думает, что это тривиальный вопрос - рассмотрим случай, когда вы не знаете ОС, на которой люди будут запускать этот исполняемый файл, и не знаете имя исполняемого файла.

Мой, возможно, ужасный,Обходной путь должен использовать INDEX, чтобы искать "/".Если он возвращает ненулевое значение, то пользователь «должен» быть в системе Linux, поэтому используйте INDEX, чтобы убрать имя исполняемого файла, и вы получите свой путь.Затем найдите «\», и ​​если INDEX найдет что-то, предположите OS=windows и удалите исполняемый файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...