GDBM不适用于Python 3.6和anaconda

Pic*_*ani 7 python dbm gdbm python-3.x anaconda

我在anaconda环境中使用Python 3.6.我安装了GDBM

conda install gdbm
Run Code Online (Sandbox Code Playgroud)

安装顺利,但我不能使用dbm.gnuPython:

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

_gdbm即使实际安装了GDBM,它也不会包含Python 模块.

这是一个已知的问题吗?我该如何解决?

谢谢!

小智 9

我也遇到过这个问题.这可能不是理想的方式,但它有效.我做了以下事情来解决这个问题 -

sudo apt-get install python3-gdbm
Run Code Online (Sandbox Code Playgroud)

这为python3安装了gdbm库,但是因为apt-get和anaconda是两个独立的包管理器; 这不会解决你的问题.我们主要这样做是为了获取.so共享库,我们将把它放在我们的anaconda安装的正确文件夹中.接下来我们使用 - 找到.so文件的位置 -

dpkg -L python3-gdbm
Run Code Online (Sandbox Code Playgroud)

这给了我们以下输出 -

/.
/usr
/usr/lib
/usr/lib/python3.5
/usr/lib/python3.5/lib-dynload
/usr/lib/python3.5/lib-dynload/_gdbm.cpython-35m-x86_64-linux-gnu.so
/usr/share
/usr/share/doc
/usr/share/doc/python3-gdbm
/usr/share/doc/python3-gdbm/copyright
/usr/share/doc/python3-gdbm/changelog.Debian.gz
/usr/share/doc/python3-gdbm/README.Debian
Run Code Online (Sandbox Code Playgroud)

我们需要的文件在这里 -

/usr/lib/python3.5/lib-dynload/_gdbm.cpython-35m-x86_64-linux-gnu.so
Run Code Online (Sandbox Code Playgroud)

将此文件复制到anaconda安装的lib-dynload文件夹中; 对我来说这是 -

cp /usr/lib/python3.5/lib-dynload/_gdbm.cpython-35m-x86_64-linux-gnu.so /home/username/anaconda3/lib/python3.5/lib-dynload
Run Code Online (Sandbox Code Playgroud)

请注意,这仅.so在复制到的目录位于python中时才有效sys.path.要找到要复制到的正确目录,假设您在激活的conda环境中,请运行:

python -c 'import sys; [print(x) for x in sys.path if "lib-dynload" in x]'
Run Code Online (Sandbox Code Playgroud)

例如,在我的情况下,目录位于环境路径内,而不是在anaconda主库中. ~/anaconda3/envs/myenvname/lib/python3.7/lib-dynload

现在尝试在python中导入模块 -

from _gdbm import *
Run Code Online (Sandbox Code Playgroud)

或者从命令行测试它:

python -m dbm.gnu
Run Code Online (Sandbox Code Playgroud)

这应该可以解决您的问题.

请注意,我的是一个Ubuntu-16.06操作系统,我的python版本是3.5.2..so文件也可以与python3.6一起使用,如果没有你可以尝试安装python3.6-gdbm,虽然快速搜索ubuntu 16.04并没有给我任何结果.

  • 感谢您提供这个有用的技巧,@Savvy。我编辑了您的答案以添加一种查找目标目录的编程方式,因为在我的情况下,它位于环境 lib 路径下,而不是在主 anaconda lib 路径中。 (3认同)