Как найти в выводе скрипта и сохранить подраздел в файл?
У меня есть команда nipype.interface.afni.Warp, которая дает мне следующий вывод терминала python:
190920-12:22:00,333 nipype.interface INFO:
stderr 2019-09-20T12:22:00.333467:++ 3dWarp: AFNI version=AFNI_19.2.21 (Aug 29 2019) [64-bit]
190920-12:22:00,334 nipype.interface INFO:
stderr 2019-09-20T12:22:00.334117:++ Authored by: RW Cox
190920-12:22:00,365 nipype.interface INFO:
stderr 2019-09-20T12:22:00.365105:++ Using minimum spacing of 1.000000 mm for new grid spacing
190920-12:22:03,252 nipype.interface INFO:
stderr 2019-09-20T12:22:03.252756:++ Output dataset /media/sf_Ubuntu_files/dicomtest/warp_test.nii.gz
190920-12:22:03,253 nipype.interface INFO:
stdout 2019-09-20T12:22:03.253083:# mat44 Obliquity Transformation ::
190920-12:22:03,253 nipype.interface INFO:
stdout 2019-09-20T12:22:03.253083: 1.000000 -0.000000 0.000000 0.000000
190920-12:22:03,253 nipype.interface INFO:
stdout 2019-09-20T12:22:03.253083: 0.000000 0.999592 -0.028568 -1.842994
190920-12:22:03,253 nipype.interface INFO:
stdout 2019-09-20T12:22:03.253083: -0.000000 0.028568 0.999592 3.788057
Я хочу захватить матрицу внизу под строкой "# mat44 Obliquity Transformation::" и записать ее в файл. Я уже делал это в bash, это выглядит так:
3dWarp -flags_and_stuff | \grep -A 4 '# mat44 Obliquity Transformation ::' > $filename.1D
Однако я хочу написать указанную выше команду bash, используя вместо этого python.
Следуя инструкциям из этого сообщения в блоге, я попробовал это:
command = ['python3' ,"nipype.interfaces.afni.Warp('more stuff').run()"]
my_env = os.environ.copy()
my_env["PATH"] = "/usr/sbin:/sbin:" + my_env["PATH"]
p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, env=my_env)
Но когда я печатаю p.communicate()
Я получил:
>>> p.communicate()
(b"python3: can't open file 'nipype.interfaces.afni.Warp(<stuff>).run()': [Errno 2] No such file or directory\n", None)
Как мне заставить эту работу работать на Python? Или лучше выполнить в bash? Сценарий, который я пишу, будет использовать эту строку тысячи раз, поэтому какой бы ни был самый быстрый (который, как я предполагаю, также означает самый "питонический") метод.
1 ответ
Я думаю, что ваши аргументы командной строки python3
неверны в Python Popen
вызов. С
command = ['python3' ,"nipype.interfaces.afni.Warp('more stuff').run()"]
запущенный python3
процесс думает, что первый аргумент - это файл, который нужно выполнить, но вы намеревались запустить фрагмент кода Python.
Измените свой command
заявление о следующем:
command = ['python3' ,'-c', "nipype.interfaces.afni.Warp('more stuff').run()"]
Это должно сделать порожденный python3
процесс интерпретирует этот аргумент как команду для выполнения, а не как имя файла.
Это, конечно, при условии, что вы в первую очередь хотите это сделать. Если вы запускаете подпроцесс Python в Python, почему бы просто не запуститьnipype.interfaces.afni.Warp('more stuff').run()
в вашем скрипте без использования Popen?