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

时间:2017-03-16 19:48:16

标签: python-2.7 anaconda luigi

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

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

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

  • 我尝试投放的任务位于C:\....\tasks.py

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

      

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

我尝试创建一个PYTHONPATH变量并添加包含我的tasks.py文件的目录的确切路径,但它不起作用。我遇到的另一个问题是,当我通过cmd使用:

启动luigi调度程序时
luigid

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

luigid --background

我收到以下错误:

No module named pwd

我的整体设置似乎有问题,任何帮助都会受到赞赏。

4 个答案:

答案 0 :(得分:4)

我遇到了同样的问题并解决了它。要安排或执行的模块必须位于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%

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

答案 1 :(得分:3)

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

  • hello_world.py包含task_namespace = 'examples'之类的内容(与存储所有这些python文件的存储库中的 python模块 examples相同):
    • 这可以仅使用 python模块 luigi外部的luigid命令(不需要守护进程examples)来执行: cd luigi && PYTHONPATH=. luigi --module examples.hello_world examples.HelloWorldTask --local-scheduler
  • top_artists.py不包含对task_namespace等内容的任何引用:
    • 这可以在 python模块中运行 examplescd 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命令是调用而不用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相关的内部结构)。

答案 2 :(得分:0)

自从我自己碰到这个问题。真正帮助我的是坚持使用documentation中给出的内容:

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

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

答案 3 :(得分:0)

luigi似乎正在更改sys.path变量。您可以将luigi软件包猴子打补丁以添加sys.path.insert(0,'')