我正在部署一个简单的Tkinter应用程序,该应用程序负责处理word文件并返回带有标记词的txt文件。主要成分是Tkinter和NLTK。
用cx_Freeze创建构建文件夹后,我发现了几个问题。 当我尝试在装有Windows的另一台PC上启动生成的exe文件时,控制台会列出“ punkt”不可用。
我试图在导入nltk之后立即插入以下代码块:
from tkinter import *
from tkinter.filedialog import askopenfilename
import os
import nltk
nltk.download('punkt') #HERE
nltk.download('stopwords') #ALSO HERE
import string
from collections import Counter
import win32com.client
from pywintypes import com_error
这是导入的代码,在执行过程中稍后会出错:
pathToProc = self.originalFile.get()
sent_tokenizer = nltk.data.load('tokenizers/punkt/italian.pickle')
snt = nltk.stem.SnowballStemmer('italian')
it_stop_words = nltk.corpus.stopwords.words('italian') + ['\n', '\t', '']
trashes = it_stop_words + list(string.punctuation)
tokensTOT = []
try:
myDoc = word.Documents.Open(pathToProc, False, False, True)
sentences = sent_tokenizer.tokenize(word.ActiveDocument.Range().Text)
myDoc.Close()
del myDoc
for sentence in sentences:
tokensTOT = tokensTOT + nltk.word_tokenize(sentence)
except com_error:
print('IMPOSSIBILE DECIFRARE IL FILE')
以下是我用于创建构建文件夹的代码,旨在将其复制并粘贴到所有Windows计算机上。
from cx_Freeze import setup, Executable
import os, sys
os.environ['TCL_LIBRARY'] = r'C:\Users\AOUP\AppData\Local\Programs\Python\Python37-32\tcl\tcl8.6'
os.environ['TK_LIBRARY'] = r'C:\Users\AOUP\AppData\Local\Programs\Python\Python37-32\tcl\tk8.6'
include_files = [r"C:\Users\AOUP\AppData\Local\Programs\Python\Python37-32\DLLs\tcl86t.dll",
r"C:\Users\AOUP\AppData\Local\Programs\Python\Python37-32\DLLs\tk86t.dll",
r"C:"]
packages = ["os",
"tkinter",
"nltk",
"string",
"collections",
"win32com.client",
"pywintypes",
"socket"]
setup(
name = 'Bea Tokenizer',
version = "2.5",
description = "Simple Tkinker tokenizer window",
options = {"build_exe": {
'packages': packages,
'include_files': include_files,
'include_msvcr': True,
}},
executables = [Executable("beaTokenizer.py", base = None)]
)
尽管输入了nltk.download('punkt')
并且
nltk.download('stopwords')
这次的错误有所不同:
[nltk_data] Error loading punkt: <urlopen error unknown url type:
[nltk_data] https>
[nltk_data] Error loading stopwords: <urlopen error unknown url type:
[nltk_data] https>
我想知道,尽管nltk是一个广泛使用且不断发展的框架,但为什么它却如此不利于部署?
我希望我已经清楚并正确解释了答案。
答案 0 :(得分:0)
尝试将安装脚本中需要的nltk软件包下载到特定的目标文件夹中,让cx_Freeze将该文件夹包含在冻结的应用程序中,并为主应用程序中的nltk软件包使用相同的文件夹,然后应找到软件包已下载。
在安装脚本中添加以下几行(用于根据您的描述创建构建文件夹):
import nltk
nltk.download('punkt', download_dir='nltk_packages')
nltk.download('stopwords', download_dir='nltk_packages')
include_files = ['nltk_packages',
# add here further include_files items you need
]
并在您的主脚本中修改下载调用:
nltk.download('punkt', download_dir='nltk_packages')
nltk.download('stopwords', download_dir='nltk_packages')
我无法测试此答案(可能是由于代理服务器的限制),但据我从nltk的源代码可以判断,此解决方案或类似的解决方案都可以解决您的问题。您可能需要根据nltk的行为来调整传递到download_dir
和include_files
的目标文件夹路径。