ModuleNotFoundError:在 macos 上使用 pyenv 构建 python 时没有名为“_lzma”的模块

Pau*_*sta 4 python macos homebrew lzma pyenv

尝试使用 pyenv 在 macOS 上构建 python 版本,但我所做的每次安装都以

? python
>>> import lzma

ModuleNotFoundError: No module named '_lzma'
Run Code Online (Sandbox Code Playgroud)

我已经安装了以下所有软件包:

brew install openssl readline sqlite3 xz zlib
xcode-select --install
Run Code Online (Sandbox Code Playgroud)

唯一需要注意的是 homebrew 将软件包安装到~/.brew.

任何意见都会受到赞赏。

Nei*_*aft 138

之前的答案都不适合我。这个要点中的说明对我有用。

简而言之:您可能缺少这些xz库,在这种情况下,您可以使用 Homebrew 安装它们,然后从以下位置重新安装/重建 Python 版本pyenv

$  brew install xz
$  pyenv uninstall <desired-python-version>
$  pyenv install <desired-python-version>
Run Code Online (Sandbox Code Playgroud)

注意:我只有安装的Python有这个问题pyenv,Mac系统Python或condapython没有这个问题。brew install python除非您有特定需求pyenv(例如需要对 python 版本/更新进行更多控制),否则最好使用breed python ( )。

  • 这解决了通过 pyenv 在 M1 Mac 上安装 python 3.10.9 时的问题 (5认同)
  • 通过 pyenv 解决了问题,M1 Mac。 (2认同)

LC1*_*117 20

这为我解决了这个问题:

sudo apt-get install lzma
sudo apt-get install liblzma-dev
sudo apt-get install libbz2-dev
Run Code Online (Sandbox Code Playgroud)

并将此文件添加到您当前的环境中:例如(请参阅: https: //github.com/pandas-dev/pandas/issues/27532#issuecomment-822272237):

sudo cp /usr/lib/python3.8/lib-dynload/_bz2.cpython-38-x86_64-linux-gnu.so /usr/local/lib/python3.8/
sudo cp /usr/lib/python3.8/lib-dynload/_lzma.cpython-38-x86_64-linux-gnu.so /usr/local/lib/python3.8/
Run Code Online (Sandbox Code Playgroud)

例如,在我的运行环境中:

sudo cp /usr/lib/python3.8/lib-dynload/_bz2.cpython-38-x86_64-linux-gnu.so /home/luca/.asdf/installs/python/3.8.10/lib/python3.8`
sudo cp /usr/lib/python3.8/lib-dynload/_lzma.cpython-38-x86_64-linux-gnu.so /home/luca/.asdf/installs/python/3.8.10/lib/python3.8
Run Code Online (Sandbox Code Playgroud)

  • 这对我有用,但我没有手动复制库,而是在安装“lzma”后重建了Python。 (4认同)

小智 7

基于pyenv wiki,您应该使用标志安装所需的python版本--enable-framework。它确实对我有用。

PYTHON_CONFIGURE_OPTS="--enable-framework" pyenv install 3.6.7
Run Code Online (Sandbox Code Playgroud)

原因是您尝试使用的模块是在C 中实现的,并且具有共享库的CPython将使用上述标志构建。


Ruo*_*ian 6

谷歌总是引导我到这个线程,但这里有一个很好的答案

简而言之,您需要执行以下操作:

CFLAGS="-I$(brew --prefix xz)/include" LDFLAGS="-L$(brew --prefix xz)/lib" pyenv install 3.9.1
Run Code Online (Sandbox Code Playgroud)

如果您是 M1 用户,这将在 Rosetta 下为您工作。

框架构建对我不起作用。


Pau*_*sta 2

最终弄清楚了。当将 Homebrew 目录从默认目录移出时才会出现此问题。当 Homebrew 正常安装时不需要这样做。

我将此添加到我的.zshrc(或者您的.bashrc.bash_profile

export LDFLAGS="-L/Users/pcosta/.brew/opt/xz/lib $LDFLAGS"
export CPPFLAGS="-I/Users/pcosta/.brew/opt/xz/include $CPPFLAGS"
export PKG_CONFIG_PATH="/Users/pcosta/.brew/opt/xz/lib/pkgconfig:$PKG_CONFIG_PATH"
Run Code Online (Sandbox Code Playgroud)

Homebrew 警告您应该对其他已安装的软件包执行此操作,但不能对 xz 执行此操作。大概是因为如果Homebrew 生活在它期望的地方,就不需要它。

  • 这会自动找到正确的brew前缀 `export LDFLAGS="-L$(brew --prefix xz)/lib $LDFLAGS"; 导出 CPPFLAGS="-I$(brew --prefix xz)/include $CPPFLAGS"; 导出 PKG_CONFIG_PATH="$(brew --prefix xz)/lib/pkgconfig:$PKG_CONFIG_PATH"` (4认同)