簡體   English   中英

無法在 MacOS 上使用 pyenv Pythons 安裝 tkinter

[英]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管理:

  1. 使用 Homebrew 安裝tcl-tk 在 shell 中運行brew install tcl-tk
  2. 在 shell 中運行echo 'export PATH="/usr/local/opt/tcl-tk/bin:$PATH"' >> ~/.zshrc
  3. 通過退出Terminal應用程序或運行source ~/.zshrc重新加載 shell
  4. 重新加載后檢查tck-tk是否在$PATH 運行echo $PATH | grep --color=auto tcl-tk echo $PATH | grep --color=auto tcl-tk 結果,您應該看到突出顯示了tcl-tk $PATH 內容
  5. 現在我們從第 1 步的 Homebrew 輸出中運行三個命令
    1. 在 shell 中運行export LDFLAGS="-L/usr/local/opt/tcl-tk/lib"
    2. 在 shell 中運行export CPPFLAGS="-I/usr/local/opt/tcl-tk/include"
    3. 在 shell 中運行export PKG_CONFIG_PATH="/usr/local/opt/tcl-tk/lib/pkgconfig"
  6. 如果您已經使用pyenv安裝了 Python 版本,則使用pyenv uninstall <your python version>卸載它。 例如pyenv uninstall 3.8.2
  7. 設置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是實際的
  8. 最后用安裝Python pyenvpyenv install <version> 例如pyenv install 3.8.2

測試

  1. 在 shell 中運行pyenv global <verion that you've just installed>
  2. 現在檢查空閑。 在 shell 中運行idle 您應該會看到沒有任何警告的空閑窗口和“以紅色打印的文本”。

IDLE 窗口從終端運行。沒有警告

  1. 現在檢查tkinter 在 shell 中運行python -m tkinter -c "tkinter._test()" 您應該會看到如圖所示的測試窗口:

tkinter 測試窗口

就是這樣!

我的環境:

檢查這是不是在執行上述步驟時出錯:

  1. macOS Catalina
  2. zsh (包含在 macOS Catalina 中)=上面的“shell”
  3. Homebrew(根據Homebrew官網的說明安裝)
  4. pyenv (根據來自 GitHub 的pyenv官方自述文件安裝 Homebrew 和 PATH 更新)
  5. Python 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我可以使用以下方法修復它。

修復

  1. 我跟着@nickolay說明安裝tkinter ,並設置路徑的正確方法。

  2. 然后,我使用pyenv install anaconda3-2020.07命令pyenv install anaconda3-2020.07

  3. 因為我使用的全球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 -)"

對於 Python 3.9 及以上版本,可以使用以下公式

brew 安裝 python-tk@3.9

它將安裝 python@3.9 和 tcl-tk 並為您綁定它們。

由於缺少依賴項,將tkinterpyenv一起使用可能會很棘手。

以下兩個步驟應該可以幫助您修復tkinterpyenv問題。

第 1 步:安裝必要的系統包

由於缺少依賴項,將tkinterpyenv一起使用可能會很棘手。

首先,讓我們確保我們已經為tkinter安裝了必要的系統包。

在 macOS 上,您可以使用 Homebrew:

brew install tcl-tk

第 2 步:鏈接正確的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM