2016-10-01 116 views
1

我在导入nltk时遇到了问题。 我配置了Apache并运行一些示例python代码,它在浏览器上运行良好。 URL是:/localhost/cgi-bin/test.py。 当我在test.py中导入nltk时,它未运行。执行不会在“import nltk”行后继续。并且它给了我那个错误ValueError:找不到默认的下载目录 但是当我在命令提示符下运行它的工作完美。 如何清除此错误?ValueError:找不到nltk的默认下载目录

回答

-1

问题可能是因为您没有为您的ntlk下载创建默认目录。如果您在Windows平台上,则只需在您的任一根目录中创建一个名为“nltk_data”的目录,并为该目录授予写入权限。自然语言工具包最初在所有根目录中搜索名为“nltk_data”的目标。

比如:建立在C文件夹:名为\驱动器“nltk_data”

后,确保一切都做精,执行脚本摆脱这种错误的。

希望这会有所帮助。

问候。

+0

如果缺省目录完全丢失,那么根据OP,从提示符运行脚本会导致相同的错误,而不是。 – lenz

+0

@lenz创建一个自定义目录将是安全的,节省时间,将是一个更好的方法,而不是在脚本中尝试一些故障。如果针对提示提出相同的问题,可以使用我在答案中提到的方法进行纠正。 –

+0

据我了解的OP,问题不在于nltk_data目录丢失,而是它没有被CGI脚本找到(虽然它存在于某处)。显然,你的答案仍然有帮助,因为它被接受了。 – lenz

0

CGI脚本执行的环境与从终端或类似环境运行CGI脚本的环境不同。具体而言,像$PYTHONPATH这样的环境变量可能不会设置为您所需的值。

丑陋但安全的解决办法是添加必需的目录里面的脚本,之前的任何第三方import语句:

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

我不完全确定这是否也适用于“默认下载目录”,但您可以尝试一下。

+0

它不工作。 – jonii

+0

我只是猜出来,或多或少,因为你在帖子中没有提供很多信息。如果您更新问题以包含更多关于您在做什么的详细信息,在什么情况下会发生什么,那么我会尽力相应地更新我的答案。 – lenz

0

问题是,在导入时,nltk会尝试初始化一个Downloader对象(即使您尚未尝试下载任何资源),但无法识别可用的下载位置。让它开心的最简单方法是在环境中定义NLTK_DATA,初始化为(a)存在的文件夹,以及(b)您的服务器具有写入权限。

如果出于某种原因不可能发生这种情况,让我们来看看引发错误的代码。 nltk\downloader.py中的函数default_download_dir()首先查找nltk.data.path(从NLTK_DATA初始化)中的可写入位置。如果找不到,则最后一次尝试:尝试在HOME目录中的文件夹nltk_data(Windows上除外)。显然,你的环境设置阻止Python将~/解析到你的HOME目录,导致错误。

# 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") 

因此,弄清楚你可以对环境做些什么来使这个功能开心。

0

问题

  1. NLTK包试图找到os.environ["APPDATA"]变量加载它的内容。

  2. XAMPP或任何其他CGI服务器不会加载所有通常在Windows上可用的os变量。

因此,我们必须明确提供APPDATA SET变量。 这可以通过2种方法完成。

解决方案

  1. 里面Python本身从NLTK包加载任何东西之前。 通过添加appdata文件夹路径。

    import os os.environ['APPDATA']="C:\Users\YOUR_USER\AppData\Roaming"

  2. 通过加入这一行,将它设置在XAMPP的的http.conf 文件中的环境变量。

    SetEnv APPDATA "${APPDATA}"