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 安装分开)。virtualenv
并pip
携手并进。
符号链接而不是复制库(和相关文件)也可以工作,如上所示这所以回答。
最后,你当然可以从源代码编译Python,并使其在特定目录中工作,而不是全局安装它(例如:像这样virtualenv
做),但如果做得错误,它可能会破坏一些现有的(Python)应用程序(例如:这就是像 homebrew/linuxbrew 这样的项目)。
一个好的现有解决方案是pyenv。请注意,它仍然会从源代码进行编译,但会在单个目录中进行编译(指定的目录或 $HOME 中的点目录)。它不会替代,virtualenv
但会阻止系统文件被编辑(因为它不会在全局/系统范围内复制已编译的二进制文件)。