17

当我想切换到 python 3.8 时,看起来我已经破坏了我的 python 安装。使用 Ubuntu 18.04。尝试使用gi,会出现以下错误:

$ python
Python 3.8.1 (default, Dec 31 2019, 18:42:42) 
[GCC 7.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
 >>> from gi.repository import GLib, Gio
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3/dist-packages/gi/__init__.py", line 42, in <module>
    from . import _gi
ImportError: cannot import name '_gi' from partially initialized module 'gi' (most likely due to a circular import) (/usr/lib/python3/dist-packages/gi/__init__.py)

尝试为 python 运行 update-alternatives,但它告诉我只配置了一个 python 替代方案(3.8)。

试图重新安装python3-gi和python3.8。还是同样的问题

4

6 回答 6

14

gi为 python 3.8安装:python3.8 -m pip install pgi 然后,而不是import gi使用:

import pgi
pgi.install_as_gi()
from gi.repository import GLib, Gio

或者,您可以强制为 python 3.8 安装 PyGObject:

sudo python3.8 -m pip install --ignore-installed PyGObject

这应该允许一个from gi import ...人像以前一样。

于 2020-02-22T13:40:40.327 回答
11

我遇到过同样的问题。我将python3链接到python3.6,对我来说它指向3.8。这解决了这个问题。

cd /usr/bin/
rm python3
ln -s python3.6 python3

就这样。现在我的系统开始正常工作了。

于 2020-07-09T01:47:51.420 回答
1

在这里找到答案https://bugzilla.redhat.com/show_bug.cgi?id=1709787

原因是 - /usr/lib64/python3.8/site-packages/gi/_gi.cpython-38m-x86_64-linux-gnu.so 名称不正确:

sh-5.0# python3 -c 'from gi.repository import GLib' Traceback(最近一次调用最后):文件“”,第 1 行,在文件“/usr/lib64/python3.8/site-packages/gi/init”。 py”,第 42 行,来自 . import _gi ImportError: cannot import name '_gi' from 'gi' (/usr/lib64/python3.8/site-packages/gi/init .py ) sh-5.0# mv /usr/lib64/python3.8/site- packages/gi/_gi.cpython-38m-x86_64-linux-gnu.so /usr/lib64/python3.8/site-packages/gi/_gi.cpython-38-x86_64-linux-gnu.so sh-5.0# python3 -c '从 gi.repository 导入 GLib'

请注意,从 3.8.0a4 开始,“m”不应该在那里。它是否以某种方式硬编码?

sh-5.0# python3-config --extension-suffix .cpython-38-x86_64-linux-gnu.so

在我的情况下

$ sudo ln -s /usr/lib/python3/dist-packages/gi/_gi.cpython-35m-x86_64-linux-gnu.so /usr/lib/python3/dist-packages/gi/_gi.cpython-38-x86_64-linux-gnu.so
$ sudo ln -s /usr/lib/python3/dist-packages/gi/_gi_cairo.cpython-35m-x86_64-linux-gnu.so /usr/lib/python3/dist-packages/gi/_gi_cairo.cpython-38-x86_64-linux-gnu.so
于 2021-06-18T17:31:06.940 回答
1

For me the workaround was to create a symlink:

cd /usr/lib/python3/dist-packages/gi/
sudo ln -s _gi.so _gi.cpython-38-x86_64-linux-gnu.so

and it solved the problem for me.

于 2021-12-06T20:21:41.303 回答
0

出现这个错误的原因是这个app找不到_gi_cairo.cpython-(version)-x86_64-linux-gnu.so.
正常匹配的Python版本,这种不匹配的情况是由于不同版本的Python的一些错误混合使用造成的。

所以基本上,你可以尝试切换你的 Python 版本(到你的操作系统的默认版本)。或者你可以去 '/usr/lib/python3/dist-packages/gi' 并创建一个新的 .so 库文件:

cp _gi_cairo.cpython-(old version)-x86_64-linux-gnu.so _gi_cairo.cpython-(new version)-x86_64-linux-gnu.so

或者

ln -s _gi_cairo.cpython-(old version)-x86_64-linux-gnu.so _gi.so
于 2022-01-21T03:46:21.420 回答
-3

有同样的问题,无法从脚本文件夹加载模块。在我的情况下,如果我更改 workdir 例如(但仅适用于内联命令):

cd /tmp; python -c 'from gocd import Server'
echo $?
0

将脚本复制到 /tmp 后,它不起作用

cp gocd.py /tmp
cd /tmp; python -c 'from gocd import Server'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/tmp/gocd.py", line 3, in <module>
    from gocd import Server
ImportError: cannot import name 'Server' from partially initialized module 'gocd' (most likely due to a circular import) (/tmp/gocd.py)
于 2020-01-24T09:25:01.630 回答