Как найти выходные данные скрипта и сохранить подраздел в файл? - PullRequest
0 голосов
/ 20 сентября 2019

У меня есть команда 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 Преобразование в наклонность ::msgstr "и напишите это в файл.Я уже сделал это в bash, который выглядит следующим образом:

3dWarp -flags_and_stuff | \grep  -A 4 '# mat44 Obliquity Transformation ::'  > $filename.1D

Однако я хочу написать вышеупомянутую команду bash, используя вместо этого python.

Следуя инструкциям thisсообщение в блоге Я попробовал это:

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 Ответ

1 голос
/ 20 сентября 2019

Я думаю, что ваши аргументы командной строки для 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?

...