10

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

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

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

  • 我要运行的任务位于C:\....\tasks.py

  • 尝试按如下方式运行它:

    C:\.... luigi --module tasks MyTask --dt 20170316
    ImportError: No module named tasks

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

luigid

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

luigid --background

我收到以下错误:

No module named pwd

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

4

4 回答 4

12

我遇到过同样的问题并解决了。您要安排或执行的模块必须位于 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 中永久添加此变量。

于 2018-04-16T21:22:59.843 回答
3

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

  • hello_world.py包含类似的东西(这与保存所有这些 python 文件的存储库中 的python 模块task_namespace = 'examples'相同): examples
    • 这可以只使用来自python 模块外部的luigi命令(不需要守护进程)来执行,如下所示:luigid examplescd 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不允许您使用连接命令,&&但您始终可以在其他)。

我不确定原因/解释,但是为了解决这个问题,您可以使用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 相关的内部结构)。

于 2017-03-29T15:46:51.107 回答
3

因为我自己也遇到了这个问题。帮助我的是从字面上坚持文档中给出的内容

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

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

于 2019-02-28T16:08:01.283 回答
0

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

于 2020-05-07T04:35:26.663 回答