缺失Python bz2模块

121

我已经安装在我的主目录下。

[spatel@~ dev1]$ /home/spatel/python-2.7.3/bin/python -V
Python 2.7.3

我正试图运行一个需要 Python 2.7.x 版本的脚本,但出现了缺少 bz2 的错误。

[spatel@~ dev1]$ ./import_logs.py
Traceback (most recent call last):
  File "./import_logs.py", line 13, in <module>
    import bz2
ImportError: No module named bz2
我曾试图安装 bz2 模块,但是遇到了很多错误。
 [spatel@dev1 python-bz2-1.1]$ /home/spatel/python-2.7.3/bin/python setup.py install
    ...
    ...
    ...
    bz2.c:1765: error: âBZ_FINISH_OKâ undeclared (first use in this function)
    bz2.c:1765: warning: comparison between pointer and integer
    bz2.c:1771: error: âPyMemberDefâ has no member named âavail_outâ
    bz2.c:1778: error: âPyMemberDefâ has no member named ânext_outâ
    bz2.c:1778: error: âPyMemberDefâ has no member named âtotal_out_hi32â
    bz2.c:1778: error: âPyMemberDefâ has no member named âtotal_out_lo32â
    bz2.c:1778: error: invalid operands to binary +
    bz2.c:1778: warning: statement with no effect
    bz2.c:1779: error: âPyMemberDefâ has no member named âavail_outâ
    bz2.c:1779: error: âPyMemberDefâ has no member named ânext_outâ
    bz2.c:1779: error: invalid operands to binary -
    bz2.c:1779: error: invalid operands to binary -
    bz2.c:1779: warning: statement with no effect
    bz2.c:1783: error: âPyMemberDefâ has no member named âavail_outâ
    bz2.c:1784: error: âPyMemberDefâ has no member named âtotal_out_hi32â
    bz2.c:1784: error: âPyMemberDefâ has no member named âtotal_out_lo32â
    bz2.c:1784: warning: passing argument 2 of â_PyString_Resizeâ makes integer from pointer without a cast
    error: command 'gcc' failed with exit status 1

为什么不使用pip安装您缺少的模块? - Bart
16个回答

190

由于您是从源代码构建Python,可能缺少bz2头文件。

在Ubuntu/Debian上安装它们:

sudo apt-get install libbz2-dev

Fedora:

sudo yum install bzip2-devel 

重新构建 Python。

你可能会注意到在配置/构建时,Python 会检查很多库,如果你错过了其中的一些库,那么你可能在你的情况下无法获得像 bz2 这样的库的支持。

你应该获取预构建的二进制文件以避免这种情况。Ubuntu 12.04 打包了 python 2.7.3,这是你的脚本所需的版本。


6
在Fedora 14中,Fedora软件包的名称为bzip2-devel。 - Dan Halbert
1
我必须安装所有这些内容才能在CentOS6.4上构建一个可用的Python2.7。yum install -y bzip2-devel zlib zlib-devel openssl openssl-devel - jamshid
1
这对我在Python3(3.6+)上有效。我使用pyenv,只需在“sudo apt-get install libbz2-dev”之前重新创建即可。 - lv10
3
嗨,我在RHEL 7上遇到了问题。我已经安装了“yum install bzip2-devel”,但仍然存在这个问题。 - ScipioAfricanus
2
这个不起作用。同样的问题。尽管我的是_bz2。 - limasxgoesto0
显示剩余8条评论

60

我在导入pandas时遇到了这个问题,Python版本为3.8.2:

import pandas as pd

导致出现长长的错误信息,并以"error: ModuleNotFoundError: No module named '_bz2'"结尾。

通过执行以下两个bash命令来解决此问题:

sudo apt-get install libbz2-dev
sudo cp /usr/lib/python3.8/lib-dynload/_bz2.cpython-38-x86_64-linux-gnu.so  /usr/local/lib/python3.8/

然后它正常运行。


10
对我很有用!我使用的是Python 3.7,所以我这样做:sudo cp /usr/lib/python3.7/lib-dynload/_bz2.cpython-37m-x86_64-linux-gnu.so /usr/local/lib/python3.7 - csch
非常好的答案,像魔法一样奏效!无需像其他地方建议的那样重新构建Python。 - Orly
9
我在一个虚拟环境中,还需要执行以下命令:sudo cp /usr/lib/python3.8/lib-dynload/_bz2.cpython-38-x86_64-linux-gnu.so /workspaces/demo_classification/.venv/lib/python3.8/site-packages/ - Partha Mandal
对于使用pyenv的用户,需要将此.so文件复制到一些路径中,例如~/.pyenv/versions/3.6.7/lib/python3.6/ - Ynjxsjmh

15
在CentOS 7上安装bzip2-devel:
sudo yum install  bzip2-devel

然后重新编译Python。


同样适用于CentOS 6。 - trinth

8
如果您在特定位置安装了Python,则仅安装libbz2-dev将不起作用。
对于CentOS,有一个解决方法:
  • Centos 6

    sudo cp /usr/lib64/python2.6/lib-dynload/bz2.so /python_install_path/lib/python2.7
    
  • Centos 7

    sudo cp /usr/lib64/python2.7/lib-dynload/bz2.so /python_install_path/lib/python2.7
    

python_install_path 通常为 /usr/local/lib/python2.7/,如果您使用自定义的 python 路径,则需要替换该路径。


这个解决方案对我来说非常完美。在将这个 bz2.so 文件从系统安装复制到我的 virtualenv 文件夹之前,我无法为 Python 脚本导入 bzip2。 - TheDailyToast
在阅读其他评论并在构建Python 2.7.14之前安装bzip2-devel之前,我一直在使用这个解决方案。 - trinth
3
我正在使用Python3,出现了错误:ImportError: 动态模块未定义模块导出函数(PyInit_bz2)。 - DunkOnly
在我没有root访问权限的集群上,这个方法在CentOS7上对我有用。你是怎么想到这个方法的?无论如何,非常感谢! - Gabriel

6
上面的解决方案可以解决Python2.7的bz2问题,但不能解决Python3.x的问题。是的,你需要_bz2.cpython-3xm-x86_64-linux-gnu.so文件,但你应该在自己的环境中构建它。
这里是我的解决方案:
  1. yum install bzip2-devel。(或apt-get)
  2. 下载bzip2-1.0.6. make && make install ()
  3. 像这样构建Python3的_bz2.cpython:

在Python3源代码文件夹Python-3.x.x下,vim run.sh。

export CFLAGS="-I/usr/include"
export LDFLAGS="-L/usr/lib64"
export LD_LIBRARY_PATH=/usr/lib64
make distclean
./configure --prefix=/home/xxx/Python3 && make && make install

您可以将前缀设置为与您的先前版本相同,这样将不会卸载您安装的任何软件包。在此之前,请创建一个备份文件夹。


请问您能否在第二点和第三点之间添加细节说明?我正在使用这个脚本,但仍然收到一个异常 https://pastebin.com/DJxUXaYd "无法导入runpy模块"。 - tuxErrante

6
在我的情况下,在导入pandas时出现了这个错误。安装Python 3.9.1解决了这个问题。
我最初使用的Python版本是3.8.6。我使用PyEnv并在运行MacOS Big Sur。
最初情况:
$ python
Python 3.8.6 (default, Nov 21 2020, 02:39:42)
[Clang 12.0.0 (clang-1200.0.32.27)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pandas as pd
Traceback (most recent call last):
...
    from _bz2 import BZ2Compressor, BZ2Decompressor
ModuleNotFoundError: No module named '_bz2'

安装了Python 3.9.1:

$ pyenv install --list
$ pyenv install 3.9.1
$ pyenv local 3.9.1
$ pyenv global 3.9.1
$ pip install pandas

重新运行:

$  python
Python 3.9.1 (default, Jul  5 2021, 22:26:09)
[Clang 12.0.5 (clang-1205.0.22.11)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pandas as pd
>>>

5

我按如下方式修复了它:

  1. # sudo find / -name '*_bz2*'

搜索结果示例:

/usr/lib64/python3.6/lib-dynload/_bz2.cpython-36m-x86_64-linux-gnu.so

  1. # sudo cp /usr/lib64/python3.6/lib-dynload/_bz2.cpython-36m-x86_64-linux-gnu.so /usr/local/python3.8.5/lib/python3.8/lib-dynload
  2. sudo mv _bz2.cpython-36m-x86_64-linux-gnu.so _bz2.cpython-38-x86_64-linux-gnu.so

如果您的Python版本为3.7,则应将文件名从36m更改为37m


谢谢这个答案,由于这个答案,我解决了很多库的问题。 在服务器上我有3.6版本,在虚拟环境中我有Python 3.10,所以一些模块在虚拟环境的Python中不可用。 - Ashish Maradiya

5

出现这种情况是因为缺失了一个名为.so的文件。

例如,对于python3.7,可以从以下网址下载该文件:_bz2.cpython-37m-x86_64-linux-gnu.so

对于不同版本的python,请查找相应版本的文件。例如,对于python3.8,将 37 更改为 38,然后找到并下载该文件。

对于Ubuntu系统:使用sudo权限将文件复制到/usr/local/lib/python3.7文件夹中。

要执行此操作,请进入已下载该文件的文件夹,并执行以下命令(根据您的python版本更改文件名和目标文件夹):

sudo cp _bz2.cpython-37m-x86_64-linux-gnu.so /usr/local/lib/python3.7

最后下载Python,解压缩文件,并在解压缩后进行配置和编译:

./configure --enable-optimizations
sudo make altinstall

4
您必须通过源代码重新安装bzip2
  1. yum install bzip2-devel

  2. wget http://www.bzip.org/1.0.6/bzip2-1.0.6.tar.gz

  3. tar -zxvf bzip2-1.0.6.tar.gz

  4. cd bzip2-1.0.6

  5. make && make install

  6. 配置并重新编译Python

这些步骤有时会起作用。
最后,我找出了问题所在,它需要 /usr/local/Python-3.5.2/lib/python3.5/lib-dynload/_bz2.cpython-35m-x86_64-linux-gnu.so ,当我通过源代码编译bzip2时可能出现问题。我将此文件从另一个虚拟机复制过来以解决问题。

导入错误:动态模块未定义模块导出函数(PyInit_bz2) - DunkOnly
1
stackoverflow.com/questions/13915137/how-do-you-assign-bz2-to-an-altinstall-of-python 这个问题救了我。 - DunkOnly
你可以发一个新链接吗?http://www.bzip.org/1.0.6/bzip2-1.0.6.tar.gz已经失效了... - karelv
新链接:https://sourceware.org/pub/bzip2/bzip2-latest.tar.gz - milembar

3

您需要安装bz2 c库的开发版本。您可能没有安装,这就是为什么在构建用户副本的Python时未安装它的原因。在Ubuntu上,它是libbz2-dev软件包。在Fedora上可能命名相同或类似。或者您可以从www.bzip.org下载它。


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