在macOS上使用pyenv构建Python时出现“ModuleNotFoundError: No module named '_lzma'”错误

69
尝试在 macOS 上使用 pyenv 构建 Python 版本,但我进行的每次安装都以...结束
❯ python
>>> import lzma

ModuleNotFoundError: No module named '_lzma'

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

brew install openssl readline sqlite3 xz zlib
xcode-select --install

唯一的注意事项是Homebrew将软件包安装到~/.brew目录下。

感谢您提供任何意见。


1
如果您从文件而不是REPL运行代码,是否会出现相同的错误? - AMC
1
这个确切的错误似乎相对较流行:https://github.com/pandas-dev/pandas/issues/27532,https://github.com/pandas-dev/pandas/issues/27543,https://dev59.com/7rXna4cB1Zd3GeqPMooM - AMC
是的,谢谢!典型的解决方案似乎是“在构建之前安装正确的软件包”。不幸的是,据我所知,我已经安装了所有相关的软件包(这就是为什么我列出了我的brew历史记录)。 - Paulo Costa
1
有趣的是,最后一个链接中的最后一个答案正是我要建议的:不要再折腾pyenv、homebrew和系统自带的Python安装了,使用Conda吧。;p - AMC
1
是的,我是一个长期使用conda的用户,现在尝试迁移到pyenv,因为它似乎更适合我的需求。这确实出乎意料,你能详细说明一下吗? - AMC
显示剩余6条评论
11个回答

118

之前的回答都对我没用。在这个gist中的说明对我有用。

简而言之:您可能缺少库,如果是这种情况,您可以使用Homebrew安装它们,然后再从中重新安装/重建Python版本:

$  brew install xz
$  pyenv uninstall <desired-python-version>
$  pyenv install <desired-python-version>

注意:我只在使用 pyenv 安装的 Python 中遇到了这个问题,而在 Mac 系统自带的 Python 或者 conda Python 中没有。除非您有特定需要(比如需要更多控制 Python 版本/更新),否则最好使用 brewed python(brew install python)而不是 pyenv


这对我也起作用了。安装xz是关键。谢谢!!! - haltersweb
5
通过pyenv在M1 Mac上安装Python 3.10.9时,这解决了问题。 - Chaffelson
2
已解决问题,通过pyenv在M1 Mac上。 - Ali Tazarv
这个答案也解决了MacBook M2的问题。谢谢! - undefined
我确认这对于M2 Mac也适用。赞! - undefined
显示剩余3条评论

29
根据pyenv wiki,你应该使用--enable-framework标志安装所需的python版本。这对我起作用了。
PYTHON_CONFIGURE_OPTS="--enable-framework" pyenv install 3.6.7

原因是您尝试使用的模块是用C实现的,而CPython使用共享库将使用上述标志进行构建。


这正是我需要的!非常感谢你!!! - Brian Booth
这个方法很管用,谢谢!如果您已经安装了pyenv python,则无需先卸载。 - Théo Rubenach
似乎有一些版本的Python和/或操作系统存在问题:https://github.com/pyenv/pyenv/issues/99 - Sarah Messer

15
这对我解决了问题。
sudo apt-get install lzma
sudo apt-get install liblzma-dev
sudo apt-get install libbz2-dev

将这些文件添加到您当前的环境中: 例如(参见: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/

例如,在我的运行环境中:
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

3
这个方法对我起作用了,但是与其手动复制库,我更喜欢在安装了“lzma”之后重新构建Python。 - Miguel Ángel Retamozo Sanchez

6

谷歌总是把我带到这个帖子,但好的答案在这里

简单来说,您需要做以下操作:

CFLAGS="-I$(brew --prefix xz)/include" LDFLAGS="-L$(brew --prefix xz)/lib" pyenv install 3.9.1

如果你是M1用户,在Rosetta下可以使用这个。
框架构建对我来说无法工作。

1
谢谢!我认为这基本上是与此处概述的解决方案相同: https://dev59.com/S1IH5IYBdhLWcg3wa9to#59723202 - Paulo Costa

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"

Homebrew警告您应该为其他已安装的软件包执行此操作,但不适用于xz。可能是因为如果Homebrew在预期位置,则不需要它。

我的端上好像不起作用。我尝试在终端中运行上面的导出命令,但没有成功。还有其他提示吗? - Andrea Moro
我也有这些环境变量(https://github.com/paw-lu/dotfiles/blob/80dc3eb6e3cc2ac8ac982bbecce97d4b572d0c89/zsh/.zshrc#L287-L307)-homebrew在安装我上面列出的软件包(`openssl`,`readline`等)时会告诉你设置它们。我在CentOS上再次遇到了这个问题,而且与xz有关。所以这似乎是主要的罪魁祸首。一个很好的起点是确保您安装了wiki页面中列出的所需软件包。,然后确保安装了必要的xz相关软件包。你是macOS吗? - Paulo Costa
1
谢谢,我已经在一会儿前解决了,当时没有意识到你已经回答了。我相信罪魁祸首是zlib,必须在xz之上安装它。我不能确定,因为我同时安装了许多其他东西python brew install automake autoconf libtool pkg-config python zlib freetype libxml2 libxslt xz libyaml 但后来我又运行了一个pyenv install xxxx,以强制进行新的编译,最终解决了问题。 - Andrea Moro
4
这段话的翻译如下: 此命令会自动查找正确的brew前缀,将其加入到环境变量中。具体命令如下: export LDFLAGS="-L$(brew --prefix xz)/lib $LDFLAGS"; export CPPFLAGS="-I$(brew --prefix xz)/include $CPPFLAGS"; export PKG_CONFIG_PATH="$(brew --prefix xz)/lib/pkgconfig:$PKG_CONFIG_PATH" - Samuel Prevost

1

问题39430?

我没有答案。但是这种症状听起来像是Python的一个bug票:

报告于2020年。不幸的是,截至2022年仍未得到修复。

“csvkit”软件包的解决方法:尝试使用python2

当我在运行MobaXterm的Windows 10上尝试使用软件包csvkit时,我遇到了这个问题:

软件包安装完全正常,但是/bin/csv*工具无法运行:

$ /bin/python3 -m pip install csvkit --quiet
✔

$ csvstat --version
Traceback (most recent call last):
  File "/bin/csvstat", line 5, in <module>
    from csvkit.utilities.csvstat import launch_new_instance
  File "/usr/lib/python3.6/site-packages/csvkit/utilities/csvstat.py", line 12, in <module>
    from csvkit.cli import CSVKitUtility, parse_column_identifiers
  File "/usr/lib/python3.6/site-packages/csvkit/cli.py", line 16, in <module>
    import lzma
  File "/usr/lib/python3.6/lzma.py", line 27, in <module>
    from _lzma import *
ModuleNotFoundError: No module named '_lzma'

我的解决方法是使用Python2,但并不完全满意。

首先,将不可用的Python3版本丢弃:

$ /bin/python3 -m pip uninstall csvkit --quiet --yes
✔

$ hash -r
✔

$ csvstat --version
csvstat: command not found
✘

现在已经不存在了。让我们再尝试一次,但这次使用python2:

$ /bin/python2 -m pip list | grep -i csv
DEPRECATION: Python 2.7 reached the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 is no longer maintained. pip 21.0 will drop support for Python 2.7 in January 2021. More details about Python 2 support in pip can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-support pip 21.0 will remove support for this functionality.
WARNING: You are using pip version 20.3.4; however, version 21.3.1 is available.
You should consider upgrading via the '/bin/python2 -m pip install --upgrade pip' command.
✘

$ /bin/python2 -m pip install csvkit --quiet
DEPRECATION: Python 2.7 reached the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 is no longer maintained. pip 21.0 will drop support for Python 2.7 in January 2021. More details about Python 2 support in pip can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-support pip 21.0 will remove support for this functionality.
  WARNING: The scripts csvclean, csvcut, csvformat, csvgrep, csvjoin, csvjson, csvlook, csvpy, csvsort, csvsql, csvstack, csvstat, in2csv and sql2csv are installed in '/usr/bin' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
WARNING: You are using pip version 20.3.4; however, version 21.3.1 is available.
You should consider upgrading via the '/bin/python2 -m pip install --upgrade pip' command.
✔

$ csvstat --version
csvstat 1.0.7
✔

结果:csvkit已安装,/bin/csvstat.exe可以运行而不出现“_lzma”错误。但不幸的是,它只能在Python2上运行,不能在Python3上运行。-- 对我来说,这个解决方法已经足够好了,因为我只需要/bin/csv*实用程序,但对于那些真正需要在Python3上运行的人可能没有什么用处。

1
这对我有用。我必须安装python2和pip2,然后我才能使用python2安装csvkit,并且它像上面描述的那样工作。谢谢。 - SomeGuyOnAComputer

1

这里很多答案都需要在Mac开发中使用brew。如果你没有brew,比如你的开发环境由nix管理,你可以按照以下步骤进行操作:

  • https://tukaani.org/xz/下载xz源代码。
  • 将其解压到一个目录中。
  • 在该目录内运行./configure --prefix=~/xz-install(你可以更改前缀为任何你想要的位置)。你可能需要先用mkdir -p确保目录存在。
  • 在该目录内运行make(注意:你需要xcode命令行工具来编译它)。
  • 运行make install。这将安装到你设置的任何目录下,使用--prefix参数。
  • 假设你的--prefix目录设置为~/xz-install/,则可以使用CFLAGS="-I~/xz-install/include" LDFLAGS="-L~/xz-install/lib" pyenv install 3.10.4或者你想要的任何版本来安装Python。

0
如果您通过 asdf 安装了 Python,可以按以下方式重新安装:
asdf uninstall python

asdf install python latest

install 命令的示例输出:

python-build 3.10.6 /Users/u/.asdf/installs/python/3.10.6
python-build: use openssl@1.1 from homebrew
python-build: use readline from homebrew
Downloading Python-3.10.6.tar.xz...
-> https://www.python.org/ftp/python/3.10.6/Python-3.10.6.tar.xz
Installing Python-3.10.6...
python-build: use readline from homebrew
python-build: use zlib from xcode sdk
Installed Python-3.10.6 to /Users/u/.asdf/installs/python/3.10.6

0
我在Debian Buster上解决了这个问题,方法是运行以下命令:
sudo apt install liblzma-dev

之后,我重新编译了Python。
虽然我不是Python的专家,但似乎它已经起作用了。

0

解决方案

首先

yum install xz-devel
yum install python-backports-lzma
pip install backports.lzma

第二

cd /usr/local/lib/python3.8
vi lzma.py 

最后 修改第27行


try:
    from _lzma import *
    from _lzma import _encode_filter_properties, _decode_filter_properties
except ImportError:
    from backports.lzma import *
    from backports.lzma import _encode_filter_properties, _decode_filter_properties

太好了!我花了几个小时才找到解决这个问题的方法。
来源:Yolo5问题

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接