在Oozie中运行python脚本时,如何导入本地python模块?

在Oozie中运行python脚本时,如何导入本地python模块?,python,hdfs,oozie,Python,Hdfs,Oozie,我有两个python文件——my_python_A.py和my_python_B.py。第一个文件引用第二个文件(来自my_python_B import*) 我正在从Oozie中的shell操作执行第一个python文件(即脚本只是python my\u python\u a.py),并收到以下错误: Traceback (most recent call last): File "my_python_A.py", line 2, in <module> from my

我有两个python文件——my_python_A.py和my_python_B.py。第一个文件引用第二个文件(
来自my_python_B import*

我正在从Oozie中的shell操作执行第一个python文件(即脚本只是
python my\u python\u 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]
回溯(最近一次呼叫最后一次):
文件“my_python_A.py”,第2行,在
从my_python_B导入*
ImportError:没有名为my_python_B的模块
Oozie启动器失败,主类[org.apache.Oozie.action.hadoop.ShellMain],退出代码[1]

这两个python文件位于HDFS中的同一目录下。如何使这个import语句工作?

我遇到了同样的问题,解决这个问题的方法是在执行python代码之前,将环境变量
PYTHONPATH
设置为shell脚本中的当前工作目录

export PYTHONPATH=`pwd`
python m_python_A.py
确保在shell操作中,您已经在
标记中包含了所有必需的python模块。假设您有一个名为sample_script.sh的shell脚本(其中包含上述命令),那么workflow.xml文件应该如下所示


${jobTracker}
${nameNode}
oozie.launcher.mapred.job.queue.name
${launcher queue}
mapred.job.queue.name
${mapredqueue}
示例_script.sh
${appPath}/sample_script.sh#sample_script.sh
${appPath}/m_python_A.py#m_python_A.py
${appPath}/m_python_B.py#m_python_B.py
Shell操作失败,错误消息[${wf:errorMessage(wf:lastErrorNode())}]
要添加什么

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

在m_python_A.py中访问(即)lib/?

中存储的任何内容通常解释器首先查看
当前目录
,然后查看
shell
,然后查看
默认路径
。您使用的是哪种环境?这些文件是同一个项目的一部分吗?如果是,也许您最好使用
\uuuu init\uuuu
file@jmugz3-不确定在群集上运行时这是否相关,因为所有文件都存储在分布式系统(即HDFS)上。明白了。我不熟悉Oozie,但听起来您的解释器好像没有识别您的模块,所以您可以尝试将您的工作目录添加到shell路径中。选中此选项,您可以尝试类似于导入sys
sys.path.append(“/Users/path/to/file”)
示例中的
${appPath}
是什么?${appPath}是hdfs上脚本所在文件夹的路径。