2016-04-25 9 views
1

私は2つのpythonファイル - my_python_A.pyとmy_python_B.pyを持っています。最初のファイルは2番目のファイルを参照します(from my_python_B import *)。OozieでPythonスクリプトを実行しているときに、ローカルのPythonモジュールをインポートするにはどうすればよいですか?

私は(つまり、スクリプトは単にpython my_python_A.pyある)Oozieシェルアクションから最初のpythonファイルを実行していて、次のエラー受け付けております:どちらのPythonのファイルが同じディレクトリの下に配置されている

Traceback (most recent call last): 
    File "my_python_A.py", line 2, in <module> 
    from my_python_B import * 
ImportError: No module named my_python_B 
Failing Oozie Launcher, Main class [org.apache.oozie.action.hadoop.ShellMain], exit code [1] 

をHDFSでこのインポートステートメントを機能させるにはどうすればよいですか?

+0

通常、インタプリタはまず 'カレントディレクトリ'を探し、 'シェル'を探して、 'デフォルトのPATH'を探します。あなたはどの環境を使っていますか?そして、これらのファイルは同じプロジェクトの一部ですか?そうであれば、おそらくあなたは '__init__'ファイルを使うほうが良いかもしれません。 – jmugz3

+0

@ jmugz3 - すべてのファイルは分散システム(すなわちHDFS)に保存されているので、クラスタで実行しているときにこれが適切かどうかはわかりません。 – John

+0

Gotcha。私はOozieに慣れていませんが、インタプリタがあなたのモジュールを認識していないように聞こえるので、あなたの作業ディレクトリをあなたのシェルパスに追加しようとする可能性があります。 – jmugz3

答えて

6

私は同じ問題に直面し、私は私のpythonコード

export PYTHONPATH=`pwd` 
python m_python_A.py 

は確かにあることを確認し、実行する前に、私はこの問題を回避働いていた方法は、シェルスクリプト内の現在の作業ディレクトリに、環境変数PYTHONPATHを設定することによりでしたあなたのシェルアクションには、必要なすべてのPythonモジュールが<file></file>タグの中に含まれています。あなたは(あなたが上記のコマンドを持っている内)sample_script.shと呼ばれるシェルスクリプトを持っていると仮定すると、あなたのworkflow.xmlファイルがこの

<workflow-app name="shellTest" xmlns="uri:oozie:workflow:0.4"> 
    <start to="shell-action"/> 
    <action name="shell-action"> 
     <shell xmlns="uri:oozie:shell-action:0.2"> 
      <job-tracker>${jobTracker}</job-tracker> 
      <name-node>${nameNode}</name-node> 
      <configuration>     
       <property> 
        <name>oozie.launcher.mapred.job.queue.name</name> 
        <value>${launcherqueue}</value> 
       </property> 
       <property> 
        <name>mapred.job.queue.name</name> 
        <value>${mapredqueue}</value> 
       </property> 
      </configuration> 
      <exec>sample_script.sh</exec> 
      <file>${appPath}/sample_script.sh#sample_script.sh</file> 
      <file>${appPath}/m_python_A.py#m_python_A.py</file> 
      <file>${appPath}/m_python_B.py#m_python_B.py</file> 
      <capture-output/> 
     </shell> 
     <ok to="end"/> 
     <error to="shell-action-failed"/> 
    </action> 

    <kill name="shell-action-failed"> 
     <message>Shell action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message> 
    </kill> 

    <end name="end" /> 

</workflow-app> 
+0

あなたの例では '$ {appPath}'とは何ですか? – Milimetric

+0

$ {appPath}は、スクリプトが存在するhdfs上のフォルダへのパスです。 –

0

あなたの中

sys.path.append(os.path.join(os.path.dirname(__file__), "lib")) 

を追加することについてはどうのようになるはずですm_python_A.py(IE)lib /に格納されているものにアクセスするには?