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

问题描述 投票:0回答:4

我在我的项目中使用 NLTK 和 wordnet。我在我的电脑上使用 pip 手动安装:

pip3 install nltk --user
在终端中,然后
nltk.download()
在 python shell 中下载 wordnet。

我想用

setup.py
文件自动化这些,但我不知道安装 wordnet 的好方法。

目前,我在调用

setup
之后有这段代码(
"nltk"
位于调用
install_requires
setup
列表中):

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

有更好的方法吗?

python nltk setup.py wordnet python-packaging
4个回答
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']
    ...
   )

在调用

do_egg_install()
之前,在
run()
方法中使用
import nltk
方法来确保安装 nltk 非常重要(另请参阅此处 python setuptools install_requires 在覆盖 cmdclass 时被忽略)。另外,不要忘记将
nltk
添加到
setup_requires


3
投票

您还可以使用 shell 脚本自动安装,例如运行(在 pip 安装 nltk 之后):

python -m nltk.downloader -d /usr/share/nltk_data wordnet

1
投票

如本线程所述,外部数据不应由setup.py 中的setuptools 处理。作为替代方案,我建议在包的

__init__.py
文件中包含以下行(放置您要下载
punkt
stopwords
的案例):

__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__


0
投票

这个设置对我有用:

import nltk
from setuptools import setup, find_packages
from setuptools.command.install import install

class InstallCommand(install):
    def run(self):
        install.run(self)
        nltk.download('wordnet')

setup(
    # other options...

    install_requires=['nltk'],
    cmdclass={
        'install': InstallCommand,
    }
)
© www.soinside.com 2019 - 2024. All rights reserved.