#python #fortran
#python #fortran
Вопрос:
Я пишу скрипт на Python со следующими целями:
- Начиная с текущего рабочего каталога, измените каталог на дочерний каталог ‘A’
- Внесите небольшие изменения в файл fort.4
- Запустите двоичный файл Fortran (синтаксис которого
../../../../
продолжается до тех пор, пока я не попаду в папку, содержащую двоичный файл); вернитесь к 2. пока моя конкретная цель не будет завершена, затем - Вернитесь из дочернего каталога в родительский, затем введите другой дочерний каталог и вернитесь к 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"])