是否可以将 Jedi 嵌入到未安装 Python 的系统上的应用程序中?

Posted

技术标签:

【中文标题】是否可以将 Jedi 嵌入到未安装 Python 的系统上的应用程序中?【英文标题】:Is it possible to embed Jedi in an application on a system where Python is not installed? 【发布时间】:2019-01-18 11:03:26 【问题描述】:

我正在开发uses Python as an embedded scripting language 的(Windows 和 Mac)应用程序。

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

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

jedi.api.environment.InvalidPythonEnvironment:

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

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

深入研究代码,我可以看到 the underlying code that is throwing 和 FileNotFoundError 是 Jedi 尝试使用 subprocess.Popen 运行 python 的时候。计算机上未安装 Python,因此失败。

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

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

我的问题:

    是否有可能让 Jedinot 生成子进程,而是在其自身运行的同一 Python 实例中运行其代码?我在文档或处理环境的源代码中找不到任何关于此的内容,并且从discussion here 推断我怀疑答案可能是否定的。

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

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

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

【问题讨论】:

【参考方案1】:
    是否有可能让 Jedi 不生成子进程,而是在其自身运行的 Python 实例中运行其代码?我在文档或处理环境的源代码中找不到任何关于此的内容,从这里的讨论推断,我怀疑答案可能是否定的。

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

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

【讨论】:

感谢您的快速回复!我想我之前阅读它时一定误解了一些链接的讨论:我认为它只是为了找到可执行文件的正确路径,而不是根本不需要可执行文件存在。我现在会更仔细地阅读它。谢谢! 目前还不清楚问题出在哪里,我们只知道sys.executable 是错误的。这是我们需要在 Jedi(而不是 jedi-vim)中正确处理的情况。 为了子孙后代,我认为选项 3 也最有可能并且可能更可取,如果我可以让它工作?我尝试简单地将build.bat 构建的python.exe 复制到我的应用程序安装中,并将其路径传递给jedi.create_environment()。它更进一步,但随后在pickle_load 调用中引发了一个更加难以理解的错误。在未能诊断出一点后,我放弃并尝试将jedi.api.environment.InterpreterEnvironment() 传递给Script 构造函数,到目前为止,这似乎工作正常。

以上是关于是否可以将 Jedi 嵌入到未安装 Python 的系统上的应用程序中?的主要内容,如果未能解决你的问题,请参考以下文章

如何安装jedi vim插件

将 Python 嵌入到 C++ 应用程序中,无论是不是安装了 Python(在 Windows 上)

Delphi JEDI JCL JclCompression:检测受密码保护的存档

是否可以将带有许多包的 Python 脚本嵌入到 C# 中?

Python编写简易木马程序(转载乌云)

Delphi JCL JEDI使用