RHEL7导入tkinter在virtualenv中失败了

问题描述 投票:3回答:2

在Redhat 7和python3.6上

我可以导入tkinter而不会出现任何错误:

Python 3.6.5 (default, Jul 25 2018, 21:22:33)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import tkinter
>>>

在一个新鲜的virtualenv

Python 3.6.4 (default, Jul 20 2018, 12:22:32)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import tkinter
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/ocr1/CRNN_Tensorflow/tkinter/__init__.py", line 36, in <module>
    import _tkinter # If this fails your Python may not be configured for Tk
ModuleNotFoundError: No module named '_tkinter'
>>>

附:这是一个由virtualenv <name_of_env>命令创建的全新virtualenv。

python-3.x tkinter virtualenv rhel
2个回答
0
投票

由于您使用的是虚拟环境,因此从没有系统软件包的“干净”Python环境开始。这有助于使虚拟环境隔离,稳定和可重现。

你有两个选择:

  1. 使用pip install在虚拟环境中安装tkinter和任何其他依赖项。
  2. 创建虚拟环境以包含系统模块时,请使用选项--system-site-packages

第二个选项更容易,因为您不需要重新安装任何东西。但是,第一个选项是首选,尤其是当您使用requirements.txtpip freeze时。然后,您可以轻松地在另一个系统上重新创建该虚拟环境。

有一些技巧可以帮助你在How to install Python 3, venv, virtualenv, and pipenv on RHEL


0
投票

我找到了两种不同的方法来最终解决我的问题。

1.确保创建的virtualenv使用相同的python版本

从上面的例子来看,virtualenv版本的python是Python 3.6.4,但我机器的python版本实际上是Python 3.6.5。

因此,virtualenv <name_of_env>是用Python 3.6.4的lib创建的。要解决这个问题可以使用

virtualenv -p <PYTHON_EXE>, --python=PYTHON_EXE <name_of_env>

要么

virtualenv --python=<PYTHON_EXE> <name_of_env>

指定python exe位置。

并使用选项--system-site-packages包含系统模块。 (归功于Rob T.回答)

2.直接从lib复制所需的包装

这种方法实际上有点棘手。只需去机器python lib目录并将你需要的软件包复制到virtualenv python lib目录中

e.f.:

cd /usr/lib/python3.6.5

cp -a ./tkinter /my_project/venv/lib/

© www.soinside.com 2019 - 2024. All rights reserved.