运行 来自 cmd 的 Luigi 任务 - "No module named tasks"

Running Luigi task from cmd - "No module named tasks"

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

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

luigid

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

luigid --background

我收到以下错误:

No module named pwd

我的整体设置似乎有问题,如果您能提供帮助,我们将不胜感激。

获取 luigi 存储库中的 examples 目录(git clone ... 并且您拥有 luigi 目录)。在那里你可以找到几个不同的例子,其中:

  • hello_world.py 包含类似 task_namespace = 'examples' 的内容(这与存储库中的 python 模块 examples 相同这些 python 个文件已保存):
    • 这可以从python模块[=60]的外部使用luigi命令(不需要守护进程luigid)来执行=] examples 为: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(也许 powershellcmd 不允许您使用 && 连接命令,但您始终可以 运行命令一个接一个)。

我不确定 reasons/explanations,但要解决此问题,您可以使用 hello_world.py 和 运行 作为 cd luigi/examples && PYTHONPATH=. luigi --module hello_world HelloWorldTask --local-scheduler(请注意luigi 命令被调用 而没有 examples. 作为命令参数的前缀 ),这将产生以下异常:

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 相关的内部结构)。

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

set PYTHONPATH=%cd%;%PYTHONPATH%

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

luigi --module tasks MyTask --local-scheduler

如果您仍然遇到问题,请使用以下方法将您的 PYTHONPATH 添加到 PATH 变量:

set PATH=%PYTHONPATH%;%PATH%

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

因为我自己 运行 进入了这个问题。对我有帮助的是严格遵守 documentation:

中给出的内容

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

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

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