RHEL7 导入 tkinter 在 virtualenv 中失败
RHEL7 import tkinter failed inside virtualenv
在 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
>>>
在一个新的虚拟环境中
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'
>>>
P.S。这是一个全新的 virtualenv,由 virtualenv <name_of_env>
命令创建。
由于您使用的是虚拟环境,因此您从 "clean" Python 环境和 none 系统包开始。这有助于使虚拟环境隔离、稳定和可重现。
你有两个选择:
- 使用
pip install
在虚拟环境中安装 tkinter 和任何其他依赖项。
- 创建虚拟环境时使用选项
--system-site-packages
以包含系统模块。
第二个选项更简单,因为您不需要重新安装任何东西。但是,第一个选项是首选,尤其是当您使用 requirements.txt
和 pip freeze
时。然后您可以轻松地在另一个系统上重新创建该虚拟环境。
How to install Python 3, venv, virtualenv, and pipenv on RHEL
中的一些提示可能对您有所帮助
我最终找到了两种不同的方法来解决我的问题。
1.确保创建的 virtualenv 使用相同的 python 版本
从我上面的例子来看,virtualenv版本的python是Python3.6.4,但是我机器的python版本实际上是Python3.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
目录
例如:
cd /usr/lib/python3.6.5
cp -a ./tkinter /my_project/venv/lib/
在 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
>>>
在一个新的虚拟环境中
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'
>>>
P.S。这是一个全新的 virtualenv,由 virtualenv <name_of_env>
命令创建。
由于您使用的是虚拟环境,因此您从 "clean" Python 环境和 none 系统包开始。这有助于使虚拟环境隔离、稳定和可重现。
你有两个选择:
- 使用
pip install
在虚拟环境中安装 tkinter 和任何其他依赖项。 - 创建虚拟环境时使用选项
--system-site-packages
以包含系统模块。
第二个选项更简单,因为您不需要重新安装任何东西。但是,第一个选项是首选,尤其是当您使用 requirements.txt
和 pip freeze
时。然后您可以轻松地在另一个系统上重新创建该虚拟环境。
How to install Python 3, venv, virtualenv, and pipenv on RHEL
中的一些提示可能对您有所帮助我最终找到了两种不同的方法来解决我的问题。
1.确保创建的 virtualenv 使用相同的 python 版本
从我上面的例子来看,virtualenv版本的python是Python3.6.4,但是我机器的python版本实际上是Python3.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
目录
例如:
cd /usr/lib/python3.6.5
cp -a ./tkinter /my_project/venv/lib/