Запуск исполняемого файла Fortran в скрипте Python

#python #fortran

#python #fortran

Вопрос:

Я пишу скрипт на Python со следующими целями:

  1. Начиная с текущего рабочего каталога, измените каталог на дочерний каталог ‘A’
  2. Внесите небольшие изменения в файл fort.4
  3. Запустите двоичный файл Fortran (синтаксис которого ../../../../ продолжается до тех пор, пока я не попаду в папку, содержащую двоичный файл); вернитесь к 2. пока моя конкретная цель не будет завершена, затем
  4. Вернитесь из дочернего каталога в родительский, затем введите другой дочерний каталог и вернитесь к 2. пока я не переберу все соответствующие папки.

Код идет хорошо. Мне приходится в значительной степени полагаться на модуль операционной системы Python для работы с каталогом. Однако у меня никогда не было опыта а) внесения незначительных изменений в файл с использованием python и б) запуска исполняемого файла. Не могли бы вы, ребята, дать мне несколько идей по модулям Python, направить меня к аналогичному источнику стека и т. Д. Или, Возможно, указать способы, которыми это можно выполнить? Я понимаю, что это расплывчатый вопрос, поэтому, пожалуйста, спросите, если вы не понимаете, о чем я спрашиваю, и я уточню. Кроме того, изменения, которые я должен внести в этот файл fort.4, являются повторяющимися по своей природе; все они происходят в одной и той же позиции в файле.

Приветствия

РЕДАКТИРОВАТЬ:: весь файл fort.4:

 file_name           
movie1.dat       !name of a general file the binary reads
nbr_box          ! line3-8 is general info 
2
this_box
1
lrdf_bead
.true.
beadid1
C1               !this is the line I must change
beadid2
F4               !This is a second line I must change
lrdf_com
.false.
bin_width
0.04             
rcut
7                
  

Так что, действительно, мне нужно, например, изменить «C1» на «C2». Изменения очень незначительны, но я должен подчеркнуть тот факт, что основной исполняемый файл fortran считывает этот fort.4, а также этот файл movie1.dat, который я уже создал. Надеюсь, это поможет

Комментарии:

1. Для запуска двоичного файла вы можете использовать subprocess модуль. Что касается внесения изменений в fort.4 файл, это сильно зависит от файла. Действительно, если файл записан с использованием «прямого» формата Fortran, то он, вероятно, будет зависящим от системы.

2. Можно ли обойти эту проблему с прямым форматом, если я напишу программу обработки файлов на другом языке, скажем, Bash или C / C , а затем вызову этот скрипт из моего скрипта Python? Извините за вопрос, но это первый раз, когда я когда-либо слышал об этом. Мой советник пишет все на Fortran, но я хотел бы быть в курсе событий.

3. Fortran великолепен, но прямой доступ (особенно к неформатированным файлам) никогда не был стандартизирован компиляторами. Новые варианты Fortran предоставляют stream доступ, который ведет себя точно так, как вы ожидаете, независимо от компилятора..

4. Если я вас правильно понимаю, есть вероятность, что я не смогу внести изменения в файл fortran, это правильно? Если я смогу автоматизировать эту задачу, это сэкономит бесчисленное количество часов аспирантов на то, что требует ненужного количества времени для выполнения вручную. Есть ли у вас какой-либо ресурс или что-нибудь, что вы могли бы передать мне по этому вопросу? Я буду очень стараться преодолеть эту проблему, если это возможно. Я знаю C, C и немного Bash, если это вообще поможет. Я был бы очень признателен, а если нет, все равно спасибо за вашу помощь!

5. имя файла «fort.4» ничего не говорит о файле, за исключением того, что кто-то был слишком ленив, чтобы дать ему имя. комментарии о прямом доступе носят спекулятивный характер. покажите инструкцию open из кода fortran.

Ответ №1:

Хорошо, здесь есть несколько важных вещей, сначала нам нужно иметь возможность управлять нашим cwd, для этого мы будем использовать модуль os

 import os
  

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

 def operateOnFolder(folder):
     os.chdir(folder)
     ...
     os.chdir("..")
  

Теперь нам нужно выполнить некоторый метод для каждого каталога, который поставляется с этим,

 for k in os.listdir(".") if os.path.isdir(k):
    operateOnFolder(k)
  

Наконец, чтобы работать с некоторым ранее существующим файлом FORTRAN, мы можем использовать встроенные файловые операторы.

 fileSource = open("someFile.f","r")
fileText = fileSource.read()
fileSource.close()
fileLines = fileText.split("n")
# change a line in the file with -> fileLines[42] = "the 42nd line"
fileText = "n".join(fileLines)
fileOutput = open("someFile.f","w")
fileOutput.write(fileText)
  

Вы можете создать и запустить свой исполняемый output.fx файл из source.f90 ::

 subprocess.call(["gfortran","-o","output.fx","source.f90"])#create
subprocess.call(["output.fx"])                             #execute
  

Комментарии:

1. Спасибо за вашу помощь! Однако я не уверен, что это имеет значение в том, что вы говорите, но для запуска двоичного файла fortran мне не нужно вызывать команду ‘gfortran -o’ и т. Д. Напротив, мне нужно запустить уже скомпилированный код, используя стандартный

2. ‘a.out’. команда или ‘../../../’, где бы ни находился двоичный файл. Может ли подпроцесс выполнять эти действия? Я действительно ценю ваш вклад в работу с файлами!

3. Неважно, это наивный вопрос. Я понимаю свою ошибку, я попробую подпроцесс. Большое спасибо за вашу помощь!

4. Я не хочу портить вам ленту обновлений, но я просто хотел сообщить вам, что я попробовал команду subprocess для запуска двоичного файла, и это сработало. Ты не представляешь, как это меня радует, спасибо, чувак.

5. Кстати, вы можете поместить относительный каталог в подпроцесс. вызывайте до тех пор, пока адрес указывает на файл, который вы хотите запустить из cwd ( os.getcwd() ) среды выполнения python. например, если ваш исполняемый файл находился в родительском каталоге родительского каталога вашего текущего каталога, вы могли бы сделать, subprocess.call(["../../a.out"])