我有两个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中的同一目录下。我怎样才能使这个import语句起作用?
答案 0 :(得分:7)
我遇到了同样的问题,我解决这个问题的方法是在执行我的python代码之前将环境变量PYTHONPATH
设置为shell脚本中的当前工作目录
export PYTHONPATH=`pwd`
python m_python_A.py
确保在shell操作中已包含<file></file>
标记内的所有必需python模块。假设您有一个名为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>
答案 1 :(得分:0)
如何添加
sys.path.append(os.path.join(os.path.dirname(__file__), "lib"))
在你的m_python_A.py中访问存储到(I.E.)lib /?
中的任何内容