Я столкнулся с проблемой при попытке использовать пакет language-tool
для Python.Эта же ошибка также возникает при использовании пакета language-check
.Мне кажется очевидным, что проблема связана с самим пакетом language-tool
, так как и сама Java, и мой сервер LanguageTool работают.
Я на Windows 10 использую Java 10. Я также пробовалс Java 8, который, как известно, полностью работает с LanguageTool.Другая ошибка возникла аналогичным образом с Java 8.
LanguageTool сам работает из командной строки и графический интерфейс также работает.Я также успешно проверил сервер LanguageTool из моего браузера на http://localhost:8081/v2/check?language=en-US&text=my+text
.
Помимо переустановки пакета language-tool
, я попытался запустить свой собственный Java-сервер LanguageTool для Python тремя способами.Все три возвращают одну и ту же ошибку в Python.Первый способ заключается в запуске следующего кода из Блокнота Jupyter:
import language_tool as lt
text = "This is very interesting text"
lt.correct(text, (lt.LanguageTool("en-US")).check(text))
Это возвращает очень подробную ошибку:
---------------------------------------------------------------------------
OSError Traceback (most recent call last)
<ipython-input-16-9112af7b3bc6> in <module>()
1 text = "This is very interesting text"
----> 2 lt.correct(text, (lt.LanguageTool("en-US")).check(text))
c:\program files\python37\lib\site-packages\language_tool\__init__.py in __init__(self, language, motherTongue)
186 def __init__(self, language=None, motherTongue=None):
187 if not self._server_is_alive():
--> 188 self._start_server_on_free_port()
189 if language is None:
190 try:
c:\program files\python37\lib\site-packages\language_tool\__init__.py in _start_server_on_free_port(cls)
321 cls._url = "http://{}:{}".format(cls._HOST, cls._port)
322 try:
--> 323 cls._start_server()
324 break
325 except ServerError:
c:\program files\python37\lib\site-packages\language_tool\__init__.py in _start_server(cls)
345 stderr=subprocess.PIPE,
346 universal_newlines=True,
--> 347 startupinfo=startupinfo
348 )
349 # Python 2.7 compatibility
c:\program files\python37\lib\subprocess.py in __init__(self, args, bufsize, executable, stdin, stdout, stderr, preexec_fn, close_fds, shell, cwd, env, universal_newlines, startupinfo, creationflags, restore_signals, start_new_session, pass_fds, encoding, errors, text)
754 c2pread, c2pwrite,
755 errread, errwrite,
--> 756 restore_signals, start_new_session)
757 except:
758 # Cleanup if the child failed starting.
c:\program files\python37\lib\subprocess.py in _execute_child(self, args, executable, preexec_fn, close_fds, pass_fds, cwd, env, startupinfo, creationflags, shell, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, unused_restore_signals, unused_start_new_session)
1153 env,
1154 os.fspath(cwd) if cwd is not None else None,
-> 1155 startupinfo)
1156 finally:
1157 # Child is launched. Close the parent's copy of those pipe
OSError: [WinError 87] The parameter is incorrect
Второй способ - запуск сервера с помощью команды-лине, запустив java -cp languagetool-server.jar org.languagetool.server.HTTPServer --port 8081
, затем запустив тот же код, что и с терминала Python в том же окне.Это возвращает:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Program Files\Python37\lib\site-packages\language_tool\__init__.py", line 188, in __init__
self._start_server_on_free_port()
File "C:\Program Files\Python37\lib\site-packages\language_tool\__init__.py", line 323, in _start_server_on_free_port
cls._start_server()
File "C:\Program Files\Python37\lib\site-packages\language_tool\__init__.py", line 347, in _start_server
startupinfo=startupinfo
File "C:\Program Files\Python37\lib\subprocess.py", line 756, in __init__
restore_signals, start_new_session)
File "C:\Program Files\Python37\lib\subprocess.py", line 1155, in _execute_child
startupinfo)
OSError: [WinError 87] The parameter is incorrect
Третий способ, которым я пытался инициировать сервер, - это использование графического интерфейса LanguageTool и запуск кода из Блокнота, который возвращает тот же подробный вывод.
Наконец, я попробовал с Java 8. В записной книжке была возвращена следующая ошибка:
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
c:\program files\python37\lib\site-packages\language_tool\__init__.py in get_languages()
489 try:
--> 490 languages = cache["languages"]
491 except KeyError:
KeyError: 'languages'
During handling of the above exception, another exception occurred:
HTTPError Traceback (most recent call last)
c:\program files\python37\lib\site-packages\language_tool\__init__.py in _get_root(cls, url, data, num_tries)
309 try:
--> 310 with urlopen(url, data, cls._TIMEOUT) as f:
311 return ElementTree.parse(f).getroot()
c:\program files\python37\lib\urllib\request.py in urlopen(url, data, timeout, cafile, capath, cadefault, context)
221 opener = _opener
--> 222 return opener.open(url, data, timeout)
223
c:\program files\python37\lib\urllib\request.py in open(self, fullurl, data, timeout)
530 meth = getattr(processor, meth_name)
--> 531 response = meth(req, response)
532
c:\program files\python37\lib\urllib\request.py in http_response(self, request, response)
640 response = self.parent.error(
--> 641 'http', request, response, code, msg, hdrs)
642
c:\program files\python37\lib\urllib\request.py in error(self, proto, *args)
568 args = (dict, 'default', 'http_error_default') + orig_args
--> 569 return self._call_chain(*args)
570
c:\program files\python37\lib\urllib\request.py in _call_chain(self, chain, kind, meth_name, *args)
502 func = getattr(handler, meth_name)
--> 503 result = func(*args)
504 if result is not None:
c:\program files\python37\lib\urllib\request.py in http_error_default(self, req, fp, code, msg, hdrs)
648 def http_error_default(self, req, fp, code, msg, hdrs):
--> 649 raise HTTPError(req.full_url, code, msg, hdrs, fp)
650
HTTPError: HTTP Error 400: Bad Request
During handling of the above exception, another exception occurred:
Error Traceback (most recent call last)
<ipython-input-1-116c54f6eff2> in <module>()
1 import language_tool as lt
2 text = "This is very interesting text"
----> 3 lt.correct(text, (lt.LanguageTool("en-US")).check(text))
c:\program files\python37\lib\site-packages\language_tool\__init__.py in __init__(self, language, motherTongue)
192 except ValueError:
193 language = FAILSAFE_LANGUAGE
--> 194 self._language = LanguageTag(language)
195 self.motherTongue = motherTongue
196 self.disabled = set()
c:\program files\python37\lib\site-packages\language_tool\__init__.py in __new__(cls, tag)
409 def __new__(cls, tag):
410 # Can’t use super() here because of 3to2.
--> 411 return str.__new__(cls, cls._normalize(tag))
412
413 def __eq__(self, other):
c:\program files\python37\lib\site-packages\language_tool\__init__.py in _normalize(cls, tag)
429 if not tag:
430 raise ValueError("empty language tag")
--> 431 languages = {l.lower().replace("-", "_"): l for l in get_languages()}
432 try:
433 return languages[tag.lower().replace("-", "_")]
c:\program files\python37\lib\site-packages\language_tool\__init__.py in get_languages()
490 languages = cache["languages"]
491 except KeyError:
--> 492 languages = LanguageTool._get_languages()
493 cache["languages"] = languages
494 return languages
c:\program files\python37\lib\site-packages\language_tool\__init__.py in _get_languages(cls)
288 url = urllib.parse.urljoin(cls._url, "Languages")
289 languages = set()
--> 290 for e in cls._get_root(url, num_tries=1):
291 languages.add(e.get("abbr"))
292 languages.add(e.get("abbrWithVariant"))
c:\program files\python37\lib\site-packages\language_tool\__init__.py in _get_root(cls, url, data, num_tries)
314 cls._start_server()
315 else:
--> 316 raise Error("{}: {}".format(cls._url, e))
317
318 @classmethod
Error: http://127.0.0.1:8081: HTTP Error 400: Bad Request
Я полностью ознакомился с документацией и попробовал некоторые другие команды, все из которых возвращают ту же ошибку.
Я потратил слишком много времени, чтобы понять это.Любая помощь в решении или устранении неполадок будет супер, очень признателен!