我可以在虚拟环境中使用 Tkinter,而不将其包含在 Python 系统中吗?

我可以在虚拟环境中使用 Tkinter,而不将其包含在 Python 系统中吗?

venv我正在运行 Linux Mint 20.3 Cinnamon,并且我从系统 Python(没有其他 Python 安装)创建了一些虚拟环境(使用标准库模块),版本为 3.8.10。我知道系统 Python 的配置没有 TKinter 支持:

>>> import _tkinter
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named '_tkinter'
>>> import tkinter
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'tkinter'
>>> import turtle
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.8/turtle.py", line 107, in <module>
    import tkinter as TK
ModuleNotFoundError: No module named 'tkinter'

奇怪的是,该turtle模块存在(并且由于tkinter丢失而无法导入),即使tkinter不存在(并且由于丢失而无法导入_tkinter)。

我了解我应该能够使 TKinter 在全球范围内可用通过安装python3-tk系统包;我知道 TKinter 依赖于无论如何都需要安装的非 Python 代码(而不是基于每个 venv)。

但是:据我了解,安装python3-tk将与安装相关的 TCL/Tk 代码一样,更新系统 Python 以包含tkinter标准库包。原则上,我想避免这种情况。我推断,缺少这个包是 Mint 团队故意选择的(特别是考虑到它在 Cinnamon 中甚至不存在),具有积极的安全影响(流氓 Python 脚本将无法利用在未来,除了用户级 venv 内)。

看来我的系统已经有无论如何,TCL 代码已安装:

$ apt list tcl
Listing... Done
tcl/focal,now 8.6.9+1 amd64 [installed]
tcl/focal 8.6.9+1 i386

是否可以将我的系统配置为

  • 核心 TCL/Tk 代码可在 Python 虚拟环境中使用;
  • tkinter我创建的每个新 virtualenv 都可以从某个标准源获取到该代码的 Python 绑定(即标准库包);但
  • 系统Python是未修改(并且设计上无法运行 Tkinter GUI 代码)?

如果是这样,怎么办?

还有什么确切地无论如何,确实建议python3-tk安装?

答案1

唯一可以做到的方法是取决于软件包维护者(例如:如果他们pip也使其可用而不是与 Python 安装分开)。virtualenvpip携手并进。

符号链接而不是复制库(和相关文件)也可以工作,如上所示所以回答。

最后,你当然可以从源代码编译Python,并使其在特定目录中工作,而不是全局安装它(例如:像这样virtualenv做),但如果做得错误,它可能会破坏一些现有的(Python)应用程序(例如:这就是像 homebrew/linuxbrew 这样的项目)。

一个好的现有解决方案是pyenv。请注意,它仍然会从源代码进行编译,但会在单个目录中进行编译(指定的目录或 $HOME 中的点目录)。它不会替代,virtualenv但会阻止系统文件被编辑(因为它不会在全局/系统范围内复制已编译的二进制文件)。

相关内容