是否可以将 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 的系统上的应用程序中?的主要内容,如果未能解决你的问题,请参考以下文章
将 Python 嵌入到 C++ 应用程序中,无论是不是安装了 Python(在 Windows 上)
Delphi JEDI JCL JclCompression:检测受密码保护的存档