[英]How install and use different versions of pythons on MacOS using pyenv
[英]Unable to install tkinter with pyenv Pythons on MacOS
通過 pyenv 安裝的 Python 版本無法導入tkinter
:
※ python
Python 3.8.1 (default, Feb 29 2020, 11:45:59)
[Clang 11.0.0 (clang-1100.0.33.17)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import tkinter
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/factor/.pyenv/versions/3.8.1/lib/python3.8/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'
>>>
或者您可能會收到有關 header 版本與二進制文件不匹配的消息:
DEPRECATION WARNING: The system version of Tk is deprecated and may be removed in a future release. Please don't rely on it. Set TK_SILENCE_DEPRECATION=1 to suppress this warning.
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/factor/.pyenv/versions/3.8.1/lib/python3.8/tkinter/__init__.py", line 4552, in _test
root = Tk()
File "/Users/factor/.pyenv/versions/3.8.1/lib/python3.8/tkinter/__init__.py", line 2263, in __init__
self._loadtk()
File "/Users/factor/.pyenv/versions/3.8.1/lib/python3.8/tkinter/__init__.py", line 2279, in _loadtk
raise RuntimeError("tk.h version (%s) doesn't match libtk.a version (%s)"
RuntimeError: tk.h version (8.6) doesn't match libtk.a version (8.5)
TL;DR 設置環境。 變量。 在提到tcl-tk
的告誡和這個GitHub的評論通過pyenv安裝新的蟒蛇時獲得tkinter
。
首先,確保您通過自制軟件擁有最新的tcl-tk
,然后注意其警告:
※ brew install tcl-tk
※ brew info tcl-tk
tcl-tk: stable 8.6.10 (bottled) [keg-only]
...
==> Caveats
tcl-tk is keg-only, which means it was not symlinked into /usr/local,
because tk installs some X11 headers and macOS provides an (older) Tcl/Tk.
If you need to have tcl-tk first in your PATH run:
echo 'export PATH="/usr/local/opt/tcl-tk/bin:$PATH"' >> ~/.zshrc
For compilers to find tcl-tk you may need to set:
export LDFLAGS="-L/usr/local/opt/tcl-tk/lib"
export CPPFLAGS="-I/usr/local/opt/tcl-tk/include"
For pkg-config to find tcl-tk you may need to set:
export PKG_CONFIG_PATH="/usr/local/opt/tcl-tk/lib/pkgconfig"
...
您還需要了解 pyenv 的PYTHON_CONFIGURE_OPTS
、 --with-tcltk-includes
和--with-tcltk-libs
,例如來自此評論。
接下來,在環境變量處於活動狀態的情況下重新安裝 Python:
※ pyenv uninstall 3.8.1
※ env \
PATH="$(brew --prefix tcl-tk)/bin:$PATH" \
LDFLAGS="-L$(brew --prefix tcl-tk)/lib" \
CPPFLAGS="-I$(brew --prefix tcl-tk)/include" \
PKG_CONFIG_PATH="$(brew --prefix tcl-tk)/lib/pkgconfig" \
CFLAGS="-I$(brew --prefix tcl-tk)/include" \
PYTHON_CONFIGURE_OPTS="--with-tcltk-includes='-I$(brew --prefix tcl-tk)/include' --with-tcltk-libs='-L$(brew --prefix tcl-tk)/lib -ltcl8.6 -ltk8.6'" \
pyenv install 3.8.1
它現在應該可以工作:
※ pyenv global 3.8.1
※ python
Python 3.8.1 (default, Feb 29 2020, 11:56:10)
[Clang 11.0.0 (clang-1100.0.33.17)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import tkinter
>>> tkinter.TclVersion, tkinter.TkVersion
(8.6, 8.6)
>>> tkinter._test()
# You should get a GUI
如果您收到以下錯誤,您可能缺少PYTHON_CONFIGURE_OPTS
。 變種以上。
DEPRECATION WARNING: The system version of Tk is deprecated and may be removed in a future release. Please don't rely on it. Set TK_SILENCE_DEPRECATION=1 to suppress this warning.
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/factor/.pyenv/versions/3.8.1/lib/python3.8/tkinter/__init__.py", line 4552, in _test
root = Tk()
File "/Users/factor/.pyenv/versions/3.8.1/lib/python3.8/tkinter/__init__.py", line 2263, in __init__
self._loadtk()
File "/Users/factor/.pyenv/versions/3.8.1/lib/python3.8/tkinter/__init__.py", line 2279, in _loadtk
raise RuntimeError("tk.h version (%s) doesn't match libtk.a version (%s)"
RuntimeError: tk.h version (8.6) doesn't match libtk.a version (8.5)
這里是一步一步的指導,使tkinter
(和IDLE)如果你用工作pyenv
的Python環境在MacOS管理:
tcl-tk
。 在 shell 中運行brew install tcl-tk
echo 'export PATH="/usr/local/opt/tcl-tk/bin:$PATH"' >> ~/.zshrc
Terminal
應用程序或運行source ~/.zshrc
重新加載 shelltck-tk
是否在$PATH
。 運行echo $PATH | grep --color=auto tcl-tk
echo $PATH | grep --color=auto tcl-tk
。 結果,您應該看到突出顯示了tcl-tk
$PATH 內容export LDFLAGS="-L/usr/local/opt/tcl-tk/lib"
export CPPFLAGS="-I/usr/local/opt/tcl-tk/include"
export PKG_CONFIG_PATH="/usr/local/opt/tcl-tk/lib/pkgconfig"
pyenv
安裝了 Python 版本,則使用pyenv uninstall <your python version>
卸載它。 例如pyenv uninstall 3.8.2
python-build
將使用的環境變量。 在 shell 中運行PYTHON_CONFIGURE_OPTS="--with-tcltk-includes='-I/usr/local/opt/tcl-tk/include' --with-tcltk-libs='-L/usr/local/opt/tcl-tk/lib -ltcl8.6 -ltk8.6'"
注意:將來使用實際安裝 Homebrew 的tck-tk
版本。 在發布時8.6
是實際的pyenv
與pyenv install <version>
。 例如pyenv install 3.8.2
測試
pyenv global <verion that you've just installed>
idle
。 您應該會看到沒有任何警告的空閑窗口和“以紅色打印的文本”。tkinter
。 在 shell 中運行python -m tkinter -c "tkinter._test()"
。 您應該會看到如圖所示的測試窗口:就是這樣!
我的環境:
檢查這是不是在執行上述步驟時出錯:
zsh
(包含在 macOS Catalina 中)=上面的“shell”pyenv
(根據來自 GitHub 的pyenv
官方自述文件安裝 Homebrew 和 PATH 更新)3.8.x
- 3.9.x
(使用pyenv install <version>
命令pyenv install <version>
) 在撰寫本文時,似乎tcl-tk
不再是 keg-only,因此不再需要設置環境變量:
※ brew info tcl-tk
==> tcl-tk: stable 8.6.13 (bottled)
...
==> Caveats
The sqlite3_analyzer binary is in the `sqlite-analyzer` formula.
==> Analytics
...
事實上,我能夠為pyenv
提供tkinter
並通過運行簡單地解決海報的問題:
※ pyenv uninstall <python version>
※ brew install tcl-tk
※ pyenv install <python version>
(FWIW,我在 Apple 硅處理器上使用 MacOS Ventura。)
對於 MacOS Big Sur (11.2.3),Carl G 的回答對我不起作用,因為我遇到了 zlib 錯誤。 建立在這個答案和這篇博文的基礎上,我發現成功了
brew install bzip2
export LDFLAGS="-L $(xcrun --show-sdk-path)/usr/lib -L brew --prefix bzip2/lib"
export CFLAGS="-L $(xcrun --show-sdk-path)/usr/include -L brew --prefix bzip2/include"
export PYTHON_CONFIGURE_OPTS="--with-tcltk-includes='-I/usr/local/opt/tcl-tk/include' --with-tcltk-libs='-L/usr/local/opt/tcl-tk/lib -ltcl8.6 -ltk8.6' --enable-framework"
pyenv install 3.8.6
Xcode、zlib 和編譯器選項似乎有問題。 從 brew 開始,他們制作了一些補丁到 3.8.0 python 版本。
我的配置
$ sw_vers
ProductName: macOS
ProductVersion: 11.2.3
BuildVersion: 20D91
$ clang --version
Apple clang version 12.0.0 (clang-1200.0.32.29)
Target: x86_64-apple-darwin20.3.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
這對我來說安裝 3.8.0 和 3.9.0
# Resinstall Xcode
sudo rm -rf /Library/Developer/CommandLineTools
xcode-select --install
# Install zlib and bzip2 using brew
brew reinstall zlib bzip2
# Install tcl-tk tkinter
brew install tcl-tk
# Uninstall previous versions from python
pyenv uninstall 3.8.0
pyenv uninstall 3.9.0
env \
PATH="$(brew --prefix tcl-tk)/bin:$PATH" \
LDFLAGS="-L$(brew --prefix tcl-tk)/lib -L$(brew --prefix zlib)/lib -L$(brew --prefix bzip2)/lib" \
CPPFLAGS="-I$(brew --prefix tcl-tk)/include -L$(brew --prefix zlib)/include -L$(brew --prefix bzip2)/include" \
PKG_CONFIG_PATH="$(brew --prefix tcl-tk)/lib/pkgconfig" \
CFLAGS="-I$(brew --prefix tcl-tk)/include -I$(brew --prefix openssl)/include -I$(brew --prefix bzip2)/include -I$(brew --prefix zlib)/include -I$(brew --prefix readline)/include -I$(xcrun --show-sdk-path)/usr/include" \
LDFLAGS="-I$(brew --prefix tcl-tk)/lib -L$(brew --prefix openssl)/lib -L$(brew --prefix readline)/lib -L$(brew --prefix zlib)/lib -L$(brew --prefix bzip2)/lib"
pyenv install --patch 3.8.3 < <(curl -sSL https://github.com/python/cpython/commit/8ea6353.patch\?full_index\=1)
env \
PATH="$(brew --prefix tcl-tk)/bin:$PATH" \
LDFLAGS="-L$(brew --prefix tcl-tk)/lib -L$(brew --prefix zlib)/lib -L$(brew --prefix bzip2)/lib" \
CPPFLAGS="-I$(brew --prefix tcl-tk)/include -L$(brew --prefix zlib)/include -L$(brew --prefix bzip2)/include" \
PKG_CONFIG_PATH="$(brew --prefix tcl-tk)/lib/pkgconfig" \
CFLAGS="-I$(brew --prefix tcl-tk)/include -I$(brew --prefix openssl)/include -I$(brew --prefix bzip2)/include -I$(brew --prefix zlib)/include -I$(brew --prefix readline)/include -I$(xcrun --show-sdk-path)/usr/include" \
LDFLAGS="-I$(brew --prefix tcl-tk)/lib -L$(brew --prefix openssl)/lib -L$(brew --prefix readline)/lib -L$(brew --prefix zlib)/lib -L$(brew --prefix bzip2)/lib"
pyenv install 3.9.0
我的消息來源:
我有同樣的問題,當我試圖安裝tkinter
通過pyenv。 如果有人遇到同樣的問題並且仍然想堅持使用pyenv
我可以使用以下方法修復它。
修復
我跟着@nickolay說明安裝tkinter
,並設置路徑的正確方法。
然后,我使用pyenv install anaconda3-2020.07
命令pyenv install anaconda3-2020.07
。
因為我使用的全球pyenv蟒蛇3.8.6:我導航到該文件夾我想使用Tkinter的和所使用的anaconda3-2020.07
利用命令在本地pyenv local anaconda3-2020.07
在特定的文件夾使用此版本pyenv的。 它運行沒有錯誤!
注意:我在.bash_profile
使用以下腳本在 cd 所需目錄時自動觸發 virtualenv
# manage python version using pyenv
if command -v pyenv 1>/dev/null 2>&1; then
eval "$(pyenv init -)"
fi
# add pyenv virtualenv
eval "$(pyenv virtualenv-init -)"
由於缺少依賴項,將tkinter
與pyenv
一起使用可能會很棘手。
以下兩個步驟應該可以幫助您修復tkinter
和pyenv
問題。
由於缺少依賴項,將tkinter
與pyenv
一起使用可能會很棘手。
首先,讓我們確保我們已經為tkinter
安裝了必要的系統包。
在 macOS 上,您可以使用 Homebrew:
brew install tcl-tk
接下來,確保在安裝 Python 時鏈接正確版本的 Tcl/ pyenv
在您的環境中構建 Python,但如果您沒有所需的依賴項,如 Tk/Tcl 庫,它將在沒有它們的情況下構建 Python。
如果您要使用的 Python 版本已安裝在您的系統上,您需要先將其卸載,然后再繼續。 例如:
pyenv uninstall 3.11.3
使用pyenv
安裝新的 Python 版本時,使用以下命令:
對於 macOS,在使用 brew 安裝 tcl-tk 之后:
brew install openssl readline sqlite3 xz zlib
env LDFLAGS="-L$(brew --prefix openssl@1.1)/lib -L$(brew --prefix readline)/lib -L$(brew --prefix sqlite3)/lib -L$(brew --prefix xz)/lib -L$(brew --prefix zlib)/lib -L$(brew --prefix tcl-tk)/lib" \
CPPFLAGS="-I$(brew --prefix openssl@1.1)/include -I$(brew --prefix readline)/include -I$(brew --prefix sqlite3)/include -I$(brew --prefix xz)/include -I$(brew --prefix zlib)/include -I$(brew --prefix tcl-tk)/include" \
PKG_CONFIG_PATH="$(brew --prefix openssl@1.1)/lib/pkgconfig:$(brew --prefix readline)/lib/pkgconfig:$(brew --prefix sqlite3)/lib/pkgconfig:$(brew --prefix xz)/lib/pkgconfig:$(brew --prefix zlib)/lib/pkgconfig:$(brew --prefix tcl-tk)/lib/pkgconfig" \
pyenv install <version>
將<version>
替換為您要安裝的版本 Python。 之后,您應該可以在pyenv
Python 環境中導入tkinter
。
請注意,我無法讓tkinter
在 Python 3.11.0
上使用pyenv
,但它在3.11.2
上運行良好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.