在setup.py脚本中安装nltk数据依赖项

16

我的项目中使用了NLTK和wordnet。我在电脑上手动安装了它们,用pip命令:pip3 install nltk --user 然后在python shell 中运行nltk.download()来下载wordnet。

我希望能够通过setup.py文件自动安装这些依赖,但我不知道如何很好地安装wordnet。

目前,在调用setup函数之后,我将以下代码添加到install_requires列表中:"nltk"

import sys
if 'install' in sys.argv:
    import nltk
    nltk.download("wordnet")

有没有更好的方法来做这件事?


从快速浏览来看,@martin-thoma似乎可以将_nltk data_依赖项打包为Python项目,并在PyPI上分发,而不需要太多工作。整个过程可以相对容易地编写脚本并委托给CI/CD系统。您应该参与这些票:https://github.com/nltk/nltk_data/issues/12 https://github.com/nltk/nltk/issues/2228 - sinoroc
@martin-thoma 另外,这是我写的一个关于使用spacy处理相同问题的相似帖子:https://stackoverflow.com/questions/57773454/package-spacy-model/57782864#57782864 这是否也适用于你的情况? - Arne
对于我的使用情况,最好的选择似乎是在requirements.txt文件中列出所有依赖项,并首先使用pip install -r requirements.txt。然后在我的setup.py中,我有手动下载命令nltk.download("punkt"),当我运行pip install -e .时使用。我相信这能够工作,因为我正在构建一个Docker镜像/容器,而不是尝试分发一个软件包。 - rkechols
3个回答

14

我通过覆盖cmdclass使用自己的Install类在setup.py中成功安装了NLTK数据:

from setuptools import setup, find_packages
from setuptools.command.install import install as _install


class Install(_install):
    def run(self):
        _install.do_egg_install(self)
        import nltk
        nltk.download("popular")

setup(...
    cmdclass={'install': Install},
    ...
    install_requires=[
      'nltk',
      ],
    setup_requires=['nltk']
    ...
   )

在你的run()方法中使用do_egg_install()方法非常重要,以确保在调用import nltk之前安装了nltk(请参见此处python setuptools install_requires is ignored when overriding cmdclass)。此外,不要忘记将nltk添加到setup_requires中。


对我不起作用! - Vladimir Vargas
也对我没用。 - rkechols
也对我没有用。 - this_is_david

3
您还可以使用shell脚本自动安装,例如,在pip安装nltk后运行:
python -m nltk.downloader -d /usr/share/nltk_data wordnet

1

此线程所述,setup.py中不应处理外部数据。作为替代方案,我建议在您的软件包的__init__.py文件中包含以下行(假设您想下载punktstopwords):

__version__ = "x.x.x"
__organization__ = "your_organization"  
import nltk 
nltk.download("stopwords") 
nltk.download("punkt")  

这样安装包时文件不会被下载,只有在导入包(即import my_package)时才会被下载。


作为一个例子,我分享一个链接到一个可以实现这一点的Python库。
首先,您需要安装该库:
pip install -U pyleetspeak

然后导入库将下载NLTK文件:

import pyleetspeak
pyleetspeak.__version__

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接