#python #nltk
#python #nltk
Вопрос:
У меня проблема с импортом nltk. Я настроил apache и запустил некоторый пример кода python, он хорошо работал в браузере. URL-адрес: /localhost/cgi-bin/test.py . Когда я импортирую nltk в test.py он не работает. Выполнение не продолжается после строки «импортировать nltk».И это выдает мне ошибку ValueError: не удалось найти каталог загрузки по умолчанию, но когда я запускаю в командной строке, он работает идеально. как удалить эту ошибку?
Ответ №1:
Проблема
-
Пакет NLTK пытается найти
os.environ["APPDATA"]
переменную для загрузки ее содержимого. -
XAMPP или любой другой CGI-сервер не загружает все переменные ОС, которые обычно доступны в Windows.
Следовательно, мы должны явно указать переменную APPDATA SET . Это можно сделать с помощью 2 методов.
Решение
- Внутри самого Python перед загрузкой чего-либо из пакета nltk. Добавив путь к папке appdata.
import os
os.environ['APPDATA'] = r"C:UsersYOUR_USERAppDataRoaming"
-
Установите переменную среды в файле 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-скриптом (хотя он где-то существовал). По-видимому, ваш ответ все же помог, поскольку он был принят.