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 기준이 아님).
그러나 내가 이해한 바에 따르면 설치는 관련 TCL/Tk 코드를 설치하고 표준 라이브러리 패키지를 python3-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 바인딩이 있습니다.- 시스템 파이썬은수정되지 않은(Tkinter GUI 코드를 실행하도록 설계되지 않았나요?)
그렇다면 어떻게 해야 할까요?
또 뭐야?정확히그래도 설치하는 것이 정말 권장됩니까 python3-tk
?
답변1
이를 수행할 수 있는 유일한 방법은 패키지 관리자에게 달려 있습니다(예: pip
Python 설치와 별도로 사용 가능하도록 만드는 경우). virtualenv
그리고 pip
손을 잡고 가십시오.
위에 표시된 대로 라이브러리(및 관련 파일)를 복사하는 대신 심볼릭 링크도 작동합니다.이것그러니 대답하세요.
마지막으로, 물론 Python을 소스에서 컴파일하고 전역적으로 설치하는 대신 특정 디렉터리에서 작동하도록 만들 수 있습니다(예: 이와 같이 virtualenv
). 하지만 잘못 수행하면 일부 기존(Python) 응용 프로그램이 중단될 수 있습니다(예: 다음과 같습니다. homebrew/linuxbrew와 같은 프로젝트).
좋은 기존 솔루션은 다음과 같습니다.피엔브. 여전히 소스에서 컴파일되지만 단일 디렉터리(지정된 디렉터리 또는 $HOME의 도트 디렉터리)에서 컴파일됩니다. 대체되지는 않지만 virtualenv
시스템 파일이 편집되는 것을 방지합니다(컴파일된 바이너리를 전역/시스템 전체에 복사하지 않기 때문).