0

我正在开发使用 Python 作为嵌入式脚本语言的(Windows 和 Mac)应用程序。

该应用程序包括一个内部文本编辑器,使用Scintilla实现,我使用Jedi进行自动完成,通常效果很好。

但是,在没有单独安装 Python 的计算机上尝试自动完成时,Jedi 会引发错误:

jedi.api.environment.InvalidPythonEnvironment

无法获取“python”的版本信息:

FileNotFoundError(2, 'The system cannot find the file specified', None, 2, None)

深入研究代码,我可以看到抛出的底层代码是FileNotFoundErrorJedi 尝试python使用subprocess.Popen. 计算机上未安装 Python,因此失败。

我还可以在安装了 Python 的计算机上重现相同的问题,方法是编辑我的环境Path变量以不包含python.exe.

理想情况下,我们不希望应用程序的用户必须安装 Python 才能让自动完成功能正常工作。

我的问题:

  1. 是否有可能让 Jedi产生子进程,而是在它本身正在运行的 Python 的同一个实例中运行它的代码?我在文档或处理环境的源代码中找不到任何关于此的内容,从这里的讨论中推断,我怀疑答案可能是否定的。

  2. 是否有可能以某种方式让 Jedi 使用python37.dll我们的应用程序用于其功能的相同内容,而不是寻找.exe不存在的文件?

  3. 有什么方法可以在我们现有的应用程序安装中进行某种最小的 Python 安装,使用相同的 DLL/Python Lib 等?我怎么能这样做呢?

  4. 有没有其他方法可以让 Jedi 自动完成功能在我们的应用程序中运行,而无需用户安装 Python,或者在我们的构建过程中包含完整的 Python 安装程序?

4

1 回答 1

1
  1. 是否有可能让绝地不产生子进程,而是在它本身运行的同一 Python 实例中运行其代码?我在文档或处理环境的源代码中找不到任何关于此的内容,从这里的讨论推断,我怀疑答案可能是否定的。

这绝对是可能的。所有的工具都在那里。这里正在进行讨论:https ://github.com/davidhalter/jedi-vim/issues/870 。

IMO 需要一个绝地补丁,jedi.api.environment.InterpreterEnvironment在某些情况下像你这样使用。这绝对是可能的,目前只是有问题。

于 2019-01-18T14:18:26.110 回答