如何在 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/ ?

中的任何内容