Ошибка значения: не удалось найти каталог загрузки nltk по умолчанию

#python #nltk

#python #nltk

Вопрос:

У меня проблема с импортом nltk. Я настроил apache и запустил некоторый пример кода python, он хорошо работал в браузере. URL-адрес: /localhost/cgi-bin/test.py . Когда я импортирую nltk в test.py он не работает. Выполнение не продолжается после строки «импортировать nltk».И это выдает мне ошибку ValueError: не удалось найти каталог загрузки по умолчанию, но когда я запускаю в командной строке, он работает идеально. как удалить эту ошибку?

Ответ №1:

Проблема

  1. Пакет NLTK пытается найти os.environ["APPDATA"] переменную для загрузки ее содержимого.

  2. XAMPP или любой другой CGI-сервер не загружает все переменные ОС, которые обычно доступны в Windows.

Следовательно, мы должны явно указать переменную APPDATA SET . Это можно сделать с помощью 2 методов.

Решение

  1. Внутри самого Python перед загрузкой чего-либо из пакета nltk. Добавив путь к папке appdata.
    import os
   os.environ['APPDATA'] = r"C:UsersYOUR_USERAppDataRoaming"
  
  1. Установите переменную среды в файле http.conf Xampp
    , добавив к нему эту строку.

    SetEnv APPDATA "${APPDATA}"

Комментарии:

1. Это сработало. Важно установить переменные env перед вызовом любого импорта. @Tomrock упомянул об этом. Я перефразирую, надеясь, что это сэкономит время для других.

Ответ №2:

Среда, в которой выполняется ваш CGI-скрипт, отличается от среды, в которой вы запускаете его с терминала или аналогичного. В частности, переменные среды, такие как $PYTHONPATH , могут быть установлены не на то, что вам нужно.

Уродливым, но безопасным обходным путем является добавление необходимых каталогов внутри скрипта перед любыми сторонними операторами импорта:

 import sys
sys.path.append('path/to/package-parent')  # change this to what you actually need
import nltk
  

Чтобы найти местоположение NLTK или что-то еще, вызывающее проблемы, импортируйте его в интерактивном сеансе.
Затем при вводе имени модуля / пакета будет выведено местоположение:

 >>> import nltk
>>> nltk
<module 'nltk' from '/usr/local/lib/python3.4/dist-packages/nltk/__init__.py'>
  

Итак, в этом случае вы должны добавить ‘/ usr/ local / lib / python3.4 / dist-packages’ sys.path .

Я не совсем уверен, относится ли это также к «каталогу загрузки по умолчанию», но вы можете попробовать.

Комментарии:

1. Я просто предполагаю, что на ровном месте, более или менее, поскольку вы не даете много информации в своем сообщении. Если вы обновите вопрос, включив более подробную информацию о том, что именно вы делаете, что именно происходит при каких обстоятельствах, я постараюсь соответствующим образом обновить свой ответ.

Ответ №3:

Проблема в том, что при импорте nltk пытается инициализировать Downloader объект (даже если вы не пытались загружать какие-либо ресурсы) и не может определить удобное место загрузки. Самый простой способ сделать его счастливым — определить NLTK_DATA в среде, инициализированной для папки, которая (а) существует, и (б) ваш сервер имеет доступ на запись.

В случае, если по какой-либо причине это невозможно, давайте посмотрим на код, который выдает ошибку. Функция default_download_dir() в nltkdownloader.py сначала ищет доступные для записи местоположения в nltk.data.path (инициализируется из NLTK_DATA ). Если он не может найти ни одного, он делает последнюю попытку: он пытается найти папку nltk_data в вашем ДОМАШНЕМ каталоге (кроме Windows). Очевидно, что настройки вашей среды не позволяют Python разрешаться ~/ в вашем ДОМАШНЕМ каталоге, что приводит к ошибке.

 # On Windows, use %APPDATA%
if sys.platform == 'win32' and 'APPDATA' in os.environ:
    homedir = os.environ['APPDATA']

# Otherwise, install in the user's home directory.
else:
    homedir = os.path.expanduser('~/')
    if homedir == '~/':
        raise ValueError("Could not find a default download directory")
  

Итак, выясните, что вы можете сделать с вашей средой, чтобы сделать эту функцию счастливой.

Ответ №4:

Проблема возникает, вероятно, потому, что у вас нет каталога по умолчанию, созданного для ваших загрузок ntlk. Если вы работаете на платформе Windows, все, что вам нужно сделать, это создать каталог с именем «nltk_data» в любом из ваших корневых каталогов и предоставить права на запись в этот каталог. Набор инструментов естественного языка изначально выполняет поиск назначения с именем «nltk_data» во всех корневых каталогах.

Например: создайте папку на вашем C: диске с именем «nltk_data»

Убедившись, что все сделано нормально, выполните свой скрипт, чтобы избавиться от этой ошибки.

Надеюсь, это поможет.

С уважением.

Комментарии:

1. Если каталог по умолчанию вообще отсутствовал, то запуск скрипта из приглашения вызовет ту же ошибку, которой он не делает, согласно OP.

2. @lenz создание пользовательского каталога будет безопасным, сэкономит время и будет лучшим подходом вместо того, чтобы пытаться использовать некоторые сбои в скрипте. Та же проблема, если она возникает для запроса, может быть устранена с помощью подхода, который я упомянул в своем ответе.

3. Насколько я понимаю OP, проблема заключалась не в том, что каталог nltk_data отсутствовал, а в том, что он не был найден CGI-скриптом (хотя он где-то существовал). По-видимому, ваш ответ все же помог, поскольку он был принят.