2017-03-08 27 views
0
を見つけることができません

それは一種の困難なタイトルに説明することである、下記を参照してください。、Pythonスクリプトでは、bashのコマンドを実行すると、他のPythonモジュールに

を私はカフェ関数の呼び出しを行うために使用bashスクリプト、この具体的な例ソルバープロトタイプを使用してモデルを訓練する:

#!/bin/bash 

TOOLS=../../build/tools 

export HDF5_DISABLE_VERSION_CHECK=1 
export PYTHONPATH=. 
#for debugging python layer 
GLOG_logtostderr=1 $TOOLS/caffe train -solver lstm_solver_flow.prototxt -weights single_frame_all_layers_hyb_flow_iter_50000.caffemodel 
echo "Done." 

私は何度もこの問題に取り組んできた。それは、「列車」や引数を渡すなど、Caffeフレームワークの組み込み関数を使用することです。列車コードは主にC++でビルドされていますが、カスタムデータレイヤー用のPythonスクリプトを呼び出します。シェルでは、すべてがスムーズに実行されます。

さて、私はPythonスクリプト(INIT)の中から、bashのコマンドを実行している場合、それはシェル= Trueの

import subprocess 

subprocess.call("export HDF5_DISABLE_VERSION_CHECK=1",shell=True)) 
subprocess.call("export PYTHONPATH=.",shell=True)) 
#for debugging python layer 
subprocess.call("GLOG_logtostderr=1 sampleexact/samplepath/build/tools/caffe train -solver lstm_solver_flow.prototxt -weights single_frame_all_layers_hyb_flow_iter_50000.caffemodel",shell=True)) 

で)(subprocess.callを使用してPythonスクリプトでこれらの正確なコマンドを呼び出しています列車のプロセスが列車のプロセスを開始することができますが、列車のプロセスは、カスタムレイヤのための別のPythonモジュールを呼び出し、それを見つけることができません。 initレイヤーとカスタムレイヤーモジュールは、両方とも同じフォルダーにあります。

この問題を解決するにはどうすればよいですか?私は本当にPythonからそれを実行して、私がデバッグできるようにする必要があります。プロジェクトの中の-any-pythonモジュールを他者からの呼び出しに到達できるようにする方法はありますか?

答えて

2

shell=Truesubprocessコマンドは、別のシェルで呼び出されます。あなたがやっていることは、新しいシェルを構成し、それを投げ捨て、新しいシェルで新しいものを何度も何度も繰り返すことです。すべての構成を単一のサブプロセスで実行する必要があります。

あなたがしていることのほとんどはにはシェルが必要ではないと言われました。例えば、サブプロセスで環境変数を設定することは、特別な書き出しをせずにPythonで行うことができます。例:

# Make a copy of the current environment, then add a few additional variables 
env = os.environ.copy() 
env['HDF5_DISABLE_VERSION_CHECK'] = '1' 
env['PYTHONPATH'] = '.' 
env['GLOG_logtostderr'] = '1' 

# Pass the augmented environment to the subprocess 
subprocess.call("sampleexact/samplepath/build/tools/caffe train -solver lstm_solver_flow.prototxt -weights single_frame_all_layers_hyb_flow_iter_50000.caffemodel", env=env, shell=True) 

奇数はあなたも、この時点でshell=Trueを必要としない、され、それを回避することは、安全上の理由から、一般的に良いアイデア(とマイナーパフォーマンス上の利点)ですので、あなただけ行うことができます:

subprocess.call([ 
    "sampleexact/samplepath/build/tools/caffe", "train", "-solver", 
    "lstm_solver_flow.prototxt", "-weights", 
    "single_frame_all_layers_hyb_flow_iter_50000.caffemodel"], env=env) 
関連する問題