从 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>(也许powershell
或cmd
不允许您使用&&
连接命令,但您始终可以一个接一个地运行这些命令)。
我不确定原因/解释,但要解决此问题,您可以使用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中的TaskClassAmbigiousException
Luigi 没有接下一个要运行的任务,剩下一堆待处理的任务,没有失败的任务