通过ansible playbook在python终端中运行命令

时间:2016-12-29 19:50:56

标签: python ansible nltk ansible-playbook

我是ansible的新手,但是我试图通过一个ansible playbook在python终端内运行一些命令。具体来说,我想下载一个语料库。

$python
>import nltk
>nltk.download
> ~ d (download)
> ~ book
> ~ q (quit)
>quit()

目前,我的playbook文件创建了一个virtualenv,可以通过requirements.txt安装nltk,但我不知道如何获取特定的nltk功能而无需手动下载。

我在我的搜索中遇到了这一行python -m nltk.downloader all,它满足了我的程序,但它下载了许多不必要的东西,占用了内存。但是,与此同时,我确实通过运行来试试:

- name: Get the nltk corpus
  shell: "python -m nltk.downloader all"

但这与错误有关:

TASK [Get the nltk corpus]*****************************************************
fatal: [127.0.0.1]: FAILED! => {"changed": true, "cmd": "python -m nltk.downloader book", "delta": "0:00:00.016227", "end": "2016-12-29 20:06:09.156953", "failed": true, "rc": 1, "start": "2016-12-29 20:06:09.140726", "stderr": "/usr/bin/python: No module named nltk", "stdout": "", "stdout_lines": [], "warnings": []}

有没有关于如何使上述代码工作的建议,或者通过ansible获取特定nltk功能来实现我的目标的其他方法?

更新

为了更清楚一点,我试图运行一个命令,该命令可以在一个安全的剧本中出售的python shell中正常工作。

例如,行nltk.download("book")完全按照我的需要在python终端内工作。但是我需要在没有手动进入终端并通过ansible playbook中的任务的情况下运行它。

我尝试过与此类似的内容,虽然它编译了,但实际上并没有按照我的需要下载图书语料库。

- name: Get the "book" nltk corpus
  shell: "/usr/local/venv/bin/python -m nltk.downloader book"

2 个答案:

答案 0 :(得分:2)

Documentationsource code提示您可以下载单个模块:

  

可以通过使用单个参数调用download()函数来下载单个包,并提供应下载的包的包标识符

如果book是您示例中的包(我不熟悉NLTK),请尝试:

- name: Get the nltk corpus
  shell: "python -m nltk.downloader book"

答案 1 :(得分:1)

命令nltk.download()用于下载nltk 数据:corpora和经过训练的模型,用于POS标记器之类的东西。要使用它,您必须已经安装了nltk代码,即您必须能够成功运行import nltk。您说您使用nltk模块运行virtualenv,但您的错误消息另有说明:/usr/bin/python: No module named nltk。如果这是真正的问题,您首先需要对其进行排序(和/或更正您的问题)。

假设您可以启动Python以使import nltk语句成功,您可以使用例如nltk.import("brown")为布朗语料库下载语料库(您声明的目标)。 (当然这必须在import nltk之后运行。)要下载NLTK书中提到的所有资源,请使用nltk.import("book")