Как импортировать локальный модуль 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/?

Другие вопросы по тегам