从 cmd 运行 Luigi 任务 - “没有名为任务的模块”

Posted

技术标签:

【中文标题】从 cmd 运行 Luigi 任务 - “没有名为任务的模块”【英文标题】:Running Luigi task from cmd - "No module named tasks" 【发布时间】:2017-08-08 04:28:02 【问题描述】:

我在通过 Windows cmd 运行 Luigi 任务时遇到问题。以下是事实:

运行安装在 C:\ProgramData\Anaconda2 (Python 2.7) 中的 Anaconda

Anaconda 已将其路径添加到 PATH 变量中,但没有 PYTHONPATH 变量

我尝试运行的任务位于C:\....\tasks.py

尝试如下运行:

C:\.... luigi --module tasks MyTask --dt 20170316 ImportError:没有名为任务的模块

我尝试创建一个PYTHONPATH 变量并将确切的路径添加到包含我的tasks.py 文件的目录,但它不起作用。我遇到的另一个问题,这可能是相关的,当我通过 cmd 启动 luigi 调度程序时使用:

luigid

它工作正常,但每当我尝试使用以下方式启动它时:

luigid --background

我收到以下错误:

No module named pwd

我的设置似乎有问题,任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

我遇到了同样的问题并解决了。您要调度或执行的模块必须位于 sys.path 中列出的任何文件夹中 在 WINDOWS TERMINAL/CMD/ 中实现此目的的一种方法是导航到您拥有 python 模块的文件夹并执行命令:

set PYTHONPATH=%cd%;%PYTHONPATH%

该命令会将您的当前目录临时添加到现有的 PYTHONPATH。 如果系统中没有 PYTHONPATH 变量,请跳过分号后的部分。 在同一终端窗口中发出 luigi 命令。

luigi --module tasks MyTask --local-scheduler

如果您仍然遇到问题,请将您的 PYTHONPATH 添加到 PATH 变量中:

set PATH=%PYTHONPATH%;%PATH%

对我来说,将当前文件夹添加到 PYTHONPATH 可以工作,并且使用批处理文件很容易执行。 或者,您可以在 Windows 中永久添加此变量。

【讨论】:

【参考方案2】:

获取luigi 存储库中的examples 目录(git clone ... 并且您拥有luigi 目录)。在那里您可以找到一些不同的示例,其中包括:

hello_world.py 包含 task_namespace = 'examples' 之类的东西(这与保存所有这些 python 文件的存储库中的 python 模块 examples 相同): 这可以只使用 python 模块 examples 外部的luigi 命令(不需要守护程序luigid)执行:cd luigi && PYTHONPATH=. luigi --module examples.hello_world examples.HelloWorldTask --local-scheduler top_artists.py 不包含对 task_namespace 之类的任何引用: 这可以从 python 模块中运行 examples: cd luigi/examples && PYTHONPATH='.' luigi --module top_artists AggregateArtists --local-scheduler --date-interval 2012-06

这对我使用 miniconda(类似于 anaconda)和 cygwin 有效,但我认为即使您不使用 cygwin 也可以工作strong>(也许powershellcmd 不允许您使用&& 连接命令,但您始终可以一个接一个地运行这些命令)。

我不确定原因/解释,但要解决此问题,您可以使用hello_world.py 并以cd luigi/examples && PYTHONPATH=. luigi --module hello_world HelloWorldTask --local-scheduler 运行它(请注意luigi 命令在没有@ 的情况下被调用987654342@作为命令参数的前缀),这将给出以下异常:

raise TaskClassNotFoundException(cls._missing_task_msg(name))
luigi.task_register.TaskClassNotFoundException: No task HelloWorldTask. Candidates are: Config,ExternalTask,RangeBase,RangeByMinutes,RangeByMinutesBase,RangeDaily,RangeDailyBase,RangeHourly,RangeHourlyBase,Task,TestNotificationsTask,WrapperTask,batch_email,core,email,examples.HelloWorldTask,execution_summary,retcode,scheduler,sendgrid,smtp,worker

为了提示您使用守护程序遇到的其他问题,我在 cygwin 上使用如下命令启动它:luigid &。该&符号后缀为您返回命令行提示符。要检查哪个 PID 与守护程序相关联,我仍然在 cygwin 上使用相同的命令行提示符并运行 ps aux | grep luigid。这种方法可能只适用于 cygwin(因为一些 bash 相关的内部结构)。

【讨论】:

【参考方案3】:

因为我自己也遇到了这个问题。对我有帮助的是严格遵守documentation 中给出的内容:

PYTHONPATH='.' luigi --module top_artists AggregateArtists --local-scheduler --date-interval 2012-06

因此,PYTHONPATH 定义必须与 luigi 命令在同一命令中。这对我有帮助。

【讨论】:

这在 Windows 中有效吗?我没有为我... @Serge Merzliakov:我在 Linux 系统上运行。在 Windows 上,也许这会有所帮助:***.com/a/4855685/7504509【参考方案4】:

luigi 似乎正在更改 sys.path 变量。您可以在某处修改 luigi 包以添加 sys.path.insert(0,'')

【讨论】:

以上是关于从 cmd 运行 Luigi 任务 - “没有名为任务的模块”的主要内容,如果未能解决你的问题,请参考以下文章

当任务依赖关系过期时,luigi 可以重新运行任务吗?

在运行()中产生任务时Luigi中的TaskClassAmbigiousException

Luigi 没有接下一个要运行的任务,剩下一堆待处理的任务,没有失败的任务

让 Airflow 表现得像 Luigi:如果任务的输出只需要获得一次,如何防止任务在 DAG 的未来运行中重新运行?

如何使 Luigi 任务生成内存列表作为目标

使动态 Luigi 任务的失败变得非关键