Как импортировать локальный модуль Python при запуске сценария Python в Oozie?
У меня есть два файла Python - my_python_A.py и my_python_B.py. Первый файл ссылается на второй (from my_python_B import *
).
Я выполняю первый файл Python из действия оболочки в Oozie (т.е. сценарий просто 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. Как я могу заставить этот оператор импорта работать?
2 ответа
Я столкнулся с той же проблемой, и я обошел эту проблему, установив переменную среды PYTHONPATH
в текущий рабочий каталог внутри сценария оболочки, прежде чем я выполню свой код Python
export PYTHONPATH=`pwd`
python m_python_A.py
Убедитесь, что в действие вашей оболочки вы включили все необходимые модули 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>
Как насчет добавления
sys.path.append(os.path.join(os.path.dirname(__file__), "lib"))
в вашем m_python_A.py для доступа ко всему, что хранится в (IE) lib/?