Python ValueError:找不到nltk的默认下载目录
我在进口nltk方面有问题。 我配置了apache并运行了一些示例python代码,它在浏览器上运行良好。 URL为:/localhost/cgi-bin/test.py。 当我在test.py中导入nltk时,它没有运行。执行在“import nltk”行之后无法继续。它给了我错误值error:找不到默认下载目录 但是当我在命令提示符下运行时,它的工作状态非常好。Python ValueError:找不到nltk的默认下载目录,python,nltk,Python,Nltk,我在进口nltk方面有问题。 我配置了apache并运行了一些示例python代码,它在浏览器上运行良好。 URL为:/localhost/cgi-bin/test.py。 当我在test.py中导入nltk时,它没有运行。执行在“import nltk”行之后无法继续。它给了我错误值error:找不到默认下载目录 但是当我在命令提示符下运行时,它的工作状态非常好。 如何删除此错误?执行CGI脚本的环境与从终端或类似设备运行CGI脚本的环境不同。具体来说,像$PYTHONPATH这样的环境变量可
如何删除此错误?执行CGI脚本的环境与从终端或类似设备运行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'>
>>导入nltk
>>>nltk
因此,在本例中,您需要将“/usr/local/lib/python3.4/dist包”附加到sys.path
我不完全确定这是否也适用于“默认下载目录”,但您可以尝试一下。问题是,导入时,
nltk
尝试初始化下载程序
对象(即使您没有尝试下载任何资源),并且无法识别可用的下载位置。最简单的方法是在环境中定义NLTK_数据
,初始化为一个文件夹,该文件夹(a)存在,并且(b)您的服务器具有写入权限
在某些原因不可能的情况下,让我们来看看抛出错误的代码。
nltk\downloader.py
中的函数default\u downloader\u dir()
首先在nltk.data.path
中查找可写位置(从nltk\u 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")
因此,请找出您可以对您的环境做些什么,以使此功能更愉快。问题的出现可能是因为您没有为ntlk下载创建默认目录。如果您在Windows平台上,则只需在任何根目录中创建一个名为“nltk_data”的目录,并授予该目录的写入权限。自然语言工具包最初在所有根目录中搜索名为“nltk_data”的目标 例如:在C:\驱动器中创建一个名为“nltk\ U数据”的文件夹 确保一切正常后,执行脚本以消除此错误 希望这有帮助
问候。问题
os.environ[“APPDATA”]
变量以加载其内容导入操作系统
os.environ['APPDATA']=“C:\Users\YOUR\U USER\APPDATA\Roaming”
SetEnv APPDATA“${APPDATA}”
我只是猜测,或多或少,因为你没有在你的帖子中给出很多信息。如果您更新问题以包含更多关于您正在做什么、在什么情况下会发生什么的详细信息,那么我将尝试相应地更新我的答案。如果默认目录完全丢失,那么从提示符运行脚本将导致相同的错误,但事实并非如此,根据OP.@lenz的说法,创建自定义目录将是安全、省时的,并且是一种更好的方法,而不是在脚本中尝试一些小故障。如果针对提示提出相同的问题,可以使用我在回答中提到的方法来纠正。据我所知,问题不是nltk_数据目录丢失,而是CGI脚本没有找到它(尽管它存在于某处)。很明显,你的答案还是有帮助的,因为它被接受了。这很有效。重要的是在调用任何导入之前设置env变量@汤姆洛克提到了这一点。我希望它能为其他人节省一些时间。