导入错误:无法从部分初始化的模块“gi”中导入名称“_gi”(很可能是由于循环导入)。

34

看起来当我想要切换到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)

尝试使用update-alternatives命令来更改Python版本,但是告诉我只有一个Python版本可供选择(3.8)。

尝试重新安装python3-gi和python3.8,但问题仍然存在。


5
/usr/bin/pythonpython3符号链接恢复为python3.6很可能会解决这个问题。真正的问题是:如何在Ubuntu上将Python 3.8设为默认版本而不破坏大量软件? - Christian
7个回答

40

我有同样的问题。我将python3链接到python3.6,它指向了3.8。这解决了问题。

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

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


1
这个解决方案解决了我的问题。为什么它有效? - i_love_somebody
1
可以使用“unlink python3”代替“rm python3”,因为它在下一步中无论如何都会被使用。 - Vishwas M.R
1
我更喜欢将3.8设置为我的默认版本。 - Heath Mitchell
我建议使用update-alternatives来替代,但这也是一个好的解决方案。 - itai
如果系统中已安装并正常运行Python3.6,则此代码应该可行。 - Austin
ln -s python3.6 python3 -- 这个可以用!但是我尝试使用 ln -s python3.8 python3 <-- 这个不行。 - jitvimol

29

安装Python 3.8的gi模块: 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 ...


这解决了我的问题(Python 3.8.5,Ubuntu 18.04,链接无效)。 - SteveS
出现了以下错误: Command "/usr/bin/python3.8 -u -c "import setuptools, tokenize;file='/tmp/pip-build-5puaelnl/pycairo/setup.py';f=getattr(tokenize, 'open', open)(file);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, file, 'exec'))" install --record /tmp/pip-jkdw0o7c-record/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /tmp/pip-build-5puaelnl/pycairo/ - user3111525
1
安装PyGObject适用于我的系统,使用python3.8作为默认版本。我猜问题出现在我安装python3.8.10时,丢失了gnome-terminal的依赖项。安装PyGobject for python3.8还需要pycairo作为依赖项,这可能会导致缺少cario库的另一个问题。当出现这种情况时,请安装libcairo2,例如“sudo apt install libcairo2-dev”(假设您正在使用ubuntu)。 - Lyle
2
这应该是被接受的解决方案,因为它不需要改变任何东西。 - franciscojavierarceo
4
在将Python 3.9设置为默认版本的系统上(Mint 20),我遇到了与您相同的问题。最初,sudo python -m pip install --ignore-installed PyGObject 失败了,我不得不先安装一些额外的软件包:sudo apt install python3.9-dev libcairo2-dev libgirepository1.0-dev - 然后它就可以工作了。 - EM0

8

我在Ubuntu 18上遇到了相同的问题,因为python3指向了python3.9。为了解决这个问题,我更改了python3的备选项:

sudo update-alternatives --config python3                                                                                                                                                                  
There are 2 choices for the alternative python3 (providing /usr/bin/python3).

  Selection    Path                Priority   Status
------------------------------------------------------------
* 0            /usr/bin/python3.9   2         auto mode
  1            /usr/bin/python3.6   1         manual mode
  2            /usr/bin/python3.9   2         manual mode

通过选择数字1,现在python3指向python3.6,一切都正常工作。

完全一样。我在使用Python3.9时遇到了这个错误,解决方法是使用以下命令切换回Python3.6。 - Yan King Yin

8

对我来说,解决方法是创建一个符号链接:

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

并且它解决了我的问题。


2
对我来说,拥有 _gi.cpython-38-x86_64-linux-gnu.so 文件后,我执行了相反的操作 (sudo ln -s _gi.cpython-38-x86_64-linux-gnu.so _gi.so),然后它就起作用了。谢谢。 - adxl

2
这个错误的原因是该应用程序找不到匹配的Python版本_gi_cairo.cpython-(version)-x86_64-linux-gnu.so。
通常,这种不匹配的情况是由于混合使用不同版本的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

2

在这里找到答案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行, 从。导入_gi ImportError:无法从'gi'(/usr/lib64/python3.8/site-packages/gi/init.py)中导入名称'_gi' 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'from gi.repository import 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

对我没用。 - Benyamin Jafari

-4

我也遇到了同样的问题,无法从脚本文件夹加载模块。在我的情况下,如果我更改工作目录(但仅适用于内联命令),则可以解决该问题:

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)

1
这怎么是问题的答案? - Christian

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