0

次のpython端末出力を提供するコマンド nipype.interface.afni.Warp があります。

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

ただし、代わりに python を使用して上記の bash コマンドを記述したいと考えています。

このブログ投稿の手順に従って、これを試しました:

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で実行したほうがいいですか?私が書いているスクリプトは、この行を何千回も使用するため、最も高速な (最も「pythonic」を意味すると仮定している) メソッドが何であれ.

4

1 に答える 1

1

Python の呼び出しpython3では、コマンドライン引数が正しくないと思います。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 を使用せずにスクリプトで を実行してみませんか?

于 2019-09-20T19:49:54.747 に答える