如何在 Oozie 中 运行 一个 python 脚本时导入本地 python 模块?
How do I import a local python module when running a python script in Oozie?
我有两个 python 文件 - my_python_A.py 和 my_python_B.py。第一个文件引用了第二个 (from my_python_B import *
).
我正在从 Oozie 中的 shell 操作执行第一个 python 文件(即脚本只是 python my_python_A.py
),并且收到以下错误:
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]
两个 python 文件都位于 HDFS 中的同一目录下。我怎样才能使这个导入语句起作用?
我遇到了同样的问题,解决这个问题的方法是在执行 [=20= 之前,将环境变量 PYTHONPATH
设置为 shell 脚本中的当前工作目录]代码
export PYTHONPATH=`pwd`
python m_python_A.py
确保在您的 shell 操作中,您已将所有必需的 python 模块包含在 <file></file>
标签内。假设您有一个名为 sample_script.sh 的 shell 脚本(其中包含上述命令),您的 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>
要补充什么
sys.path.append(os.path.join(os.path.dirname(__file__), "lib"))
在您的 m_python_A.py 中访问存储在 (I.E.) lib/ ?
中的任何内容
我有两个 python 文件 - my_python_A.py 和 my_python_B.py。第一个文件引用了第二个 (from my_python_B import *
).
我正在从 Oozie 中的 shell 操作执行第一个 python 文件(即脚本只是 python my_python_A.py
),并且收到以下错误:
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]
两个 python 文件都位于 HDFS 中的同一目录下。我怎样才能使这个导入语句起作用?
我遇到了同样的问题,解决这个问题的方法是在执行 [=20= 之前,将环境变量 PYTHONPATH
设置为 shell 脚本中的当前工作目录]代码
export PYTHONPATH=`pwd`
python m_python_A.py
确保在您的 shell 操作中,您已将所有必需的 python 模块包含在 <file></file>
标签内。假设您有一个名为 sample_script.sh 的 shell 脚本(其中包含上述命令),您的 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>
要补充什么
sys.path.append(os.path.join(os.path.dirname(__file__), "lib"))
在您的 m_python_A.py 中访问存储在 (I.E.) lib/ ?
中的任何内容