Msys2与Python 3.8: ImportError: 无法从'io'导入名称为'open_code'的内容

13
注意:根据评论,问题已经进行了多次编辑。下面标示了这些编辑,并用线条分隔开来。 目前唯一剩下的问题似乎是numpy无法加载,可能是由于存在两个不同的Python 3.8系统所致(但并不确定)。
几个月前,我更新了我的msys2系统。显然,这包括从python 3.7升级到3.8的更新,但留下了两个损坏的Python:当它是3.7时,我可以启动python,但没有相关的包;而当它是3.8时,我不能启动python,但该版本却持有包。我不知道出了什么问题,或者我做错了什么。我只是在升级后第一次想再次使用Python时才注意到这一点。
我将在此处描述我遵循的步骤以及我发现的内容。我将在下面发布支持代码,以便更好地理解。
1. 我可以启动Python,但在Python中找不到pandas等许多其他包。进一步检查,/mingw64/lib/python3.7/site-packages实际上是空的(在升级到3.8时肯定被清空了)。 2. 查找pandas包,我发现我安装了一个版本。 3. pandas版本是针对Python 3.8的,肯定是从3.7升级而来。 4. 我将PYTHONPATH从3.7重定向到3.8。 5. 现在问题是:
如何修复给出下面错误的python3.8? ImportError: cannot import name 'open_code' from 'io' (unknown location) 如何修复给出下面问题的python3.8?
新问题:
5.1. 我应该让python指向3.8,并且还要修复包。
5.2. 一些模块找不到,其他一些模块可以找到。
注意:我不知道Msys2升级破坏了python2-pyqt5是否与此有关。
相关:

https://github.com/tox-dev/tox/issues/1334

https://github.com/yan12125/python3-android/issues/19

https://python-forum.io/Thread-Fatal-Python-error-init-sys-streams-can-t-initialize-sys-standard-streams-Attribute


TL;DR: 支持代码

  1. pandas not found

    $ python
    Python 3.7.4 (default, Jul 11 2019, 10:29:54)
    [GCC 9.1.0] on msys
    Type "help", "copyright", "credits" or "license" for more information.
    Reading /home/user1/.pythonrc
    readline is in /usr/lib/python3.7/lib-dynload/readline.cpython-37m.dll
    >>> import pandas
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ModuleNotFoundError: No module named 'pandas'
    >>>
    
  2. pandas is actually installed

    $ pacman -Sl | grep python | grep installed
    mingw64 mingw-w64-x86_64-python 3.8.2-1 [installed: 3.8.1-1]
    mingw64 mingw-w64-x86_64-python-apipkg 1.5-1 [installed]
    ...
    mingw64 mingw-w64-x86_64-python-pandas 1.0.3-1 [installed: 1.0.1-1]
    ...
    mingw64 mingw-w64-x86_64-python2-setuptools 44.1.0-1 [installed: 42.0.2-1]
    msys python 3.7.4-1 [installed]
    msys python2 2.7.17-1 [installed]
    
  3. My pandas version is for python 3.8

    $ pacman -Ql mingw-w64-x86_64-python-pandas | head -5
    mingw-w64-x86_64-python-pandas /mingw64/
    mingw-w64-x86_64-python-pandas /mingw64/lib/
    mingw-w64-x86_64-python-pandas /mingw64/lib/python3.8/
    mingw-w64-x86_64-python-pandas /mingw64/lib/python3.8/site-packages/
    mingw-w64-x86_64-python-pandas /mingw64/lib/python3.8/site-packages/pandas-1.0.1-py3.8.egg-info/
    
  4. I redirected PYTHONPATH from 3.7 to 3.8

    Changed

    export PYVERSION="3.7"
    export PYTHONDIR2="${MINGW_HOME}/lib/python${PYVERSION}"
    export PYTHONPATH="${PYTHONDIR2}:${PYTHONDIR2}/site-packages"
    

    to

    export PYVERSION="3.8"
    ...
    
  5. Now I cannot even start python. EDIT: Old problem:

    $ python
    Fatal Python error: init_sys_streams: can't initialize sys standard streams
    Traceback (most recent call last):
      File "/c/Users/user1/Documents/appls_mydocs/PortableApps/MSYS2Portable/App/msys32/mingw64/lib/python3.8/io.py", line 54, in <module>
    ImportError: cannot import name 'open_code' from 'io' (unknown location)
    Aborted (core dumped)
    

新问题:

$ python --version
Python 3.7.4
$ type python
python is hashed (/usr/bin/python)
$ ls /usr/bin/python
/usr/bin/python
$ python3.8
Python 3.8.2 (default, Apr  9 2020, 13:17:39)  [GCC 9.3.0 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
Reading C:/Users/user1/Documents/appls_mydocs/PortableApps/MSYS2Portable/App/msys32/home/user1/.pythonrc
Module readline not available.
Traceback (most recent call last):
  File "C:/Users/user1/Documents/appls_mydocs/PortableApps/MSYS2Portable/App/msys32/home/user1/.pythonrc", line 42, in <module>
    del os, atexit, readline, rlcompleter, save_history, historyPath
NameError: name 'readline' is not defined
>>> import readline
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'readline'
>>> import zipfile
>>> import pandas
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:/Users/user1/Documents/appls_mydocs/PortableApps/MSYS2Portable/App/msys32/mingw64/lib/python3.8/site-packages/pandas/__init__.py", line 16, in <module>
    raise ImportError(
ImportError: Unable to import required dependencies:
numpy: DLL load failed while importing _ctypes: No se puede encontrar el módulo especificado.
>>> import numpy
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:/Users/user1/Documents/appls_mydocs/PortableApps/MSYS2Portable/App/msys32/mingw64/lib/python3.8/site-packages/numpy/__init__.py", line 142, in <module>
    from . import core
  File "C:/Users/user1/Documents/appls_mydocs/PortableApps/MSYS2Portable/App/msys32/mingw64/lib/python3.8/site-packages/numpy/core/__init__.py", line 106, in <module>
    from . import _dtype_ctypes
  File "C:/Users/user1/Documents/appls_mydocs/PortableApps/MSYS2Portable/App/msys32/mingw64/lib/python3.8/site-packages/numpy/core/_dtype_ctypes.py", line 25, in <module>
    import _ctypes
ImportError: DLL load failed while importing _ctypes: No se puede encontrar el módulo especificado.
>>> exit()
Error in atexit._run_exitfuncs:
Traceback (most recent call last):
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 973, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'readline'

编辑#2:根据要求添加信息。 我刚刚注意到我没有pip。这与我从未使用pip安装任何软件包的事实相符...

$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/opt/bin:/c/Windows/System32:/c/Windows:/c/Windows/System32/Wbem:/c/Windows/System32/WindowsPowerShell/v1.0/:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl:/c/Users/user1/OneDrive/Documents/soft-hard-ware/linux-ubuntu:/c/Users/user1/OneDrive/Documents/soft-hard-ware/linux-ubuntu/rsync:/c/Users/user1/Documents/appls_mydocs/science-math-visualization/gp524-win64-mingw_3/gnuplot/bin:/mingw64/bin
$ echo $PYTHONPATH
/c/Users/user1/Documents/appls_mydocs/PortableApps/MSYS2Portable/App/msys32/mingw64/lib/python3.8:/c/Users/user1/Documents/appls_mydocs/PortableApps/MSYS2Portable/App/msys32/mingw64/lib/python3.8/site-packages
$ echo $PYTHONSTARTUP
/home/user1/.pythonrc
$ which python3.8
/mingw64/bin/python3.8
$ python3.8 -m pip freeze
C:/Users/user1/Documents/appls_mydocs/PortableApps/MSYS2Portable/App/msys32/mingw64/bin/python3.8.exe: No module named pip
$ python3.8 -c "import sys; print(sys.builtin_module_names)"
('_abc', '_ast', '_codecs', '_collections', '_functools', '_imp', '_io', '_locale', '_operator', '_signal', '_sre', '_stat', '_string', '_symtable', '_thread', '_tracemalloc', '_warnings', '_weakref', '_winapi', 'atexit', 'builtins', 'errno', 'faulthandler', 'gc', 'itertools', 'marshal', 'msvcrt', 'nt', 'sys', 'time', 'winreg', 'xxsubtype')

编辑 #3:按要求发布,附加信息。

$ cat .pythonrc
import os
print( "Reading " + os.path.realpath(__file__) )

# enable syntax completion
try:
    import readline
    print( "readline is in " + readline.__file__ )
except ImportError:
    print("Module readline not available.")
else:
    import rlcompleter
    readline.parse_and_bind("tab: complete")

# From https://docs.python.org/2/tutorial/interactive.html

# Add auto-completion and a stored history file of commands to your Python
# interactive interpreter. Requires Python 2.0+, readline. Autocomplete is
# bound to the Esc key by default (you can change it - see readline docs).
#
# Store the file in ~/.pystartup, and set an environment variable to point
# to it:  "export PYTHONSTARTUP=~/.pystartup" in bash.

import atexit
import os
#import readline
#import rlcompleter

historyPath = os.path.expanduser("~/.pyhistory")

def save_history(historyPath=historyPath):
    import readline
    readline.write_history_file(historyPath)

if os.path.exists(historyPath):
    #import readline
    readline.read_history_file(historyPath)

atexit.register(save_history)
del os, atexit, readline, rlcompleter, save_history, historyPath

我不明白为什么which python3.8PYTHONPATH不同步:

$ cygpath -w $(which python3.8)
C:\Users\user1\Documents\appls_mydocs\PortableApps\MSYS2Portable\App\msys32\mingw64\bin\python3.8.exe
$ echo $PYTHONPATH
/c/Users/user1/Documents/appls_mydocs/PortableApps/MSYS2Portable/App/msys32/mingw64/lib/python3.8:/c/Users/user1/Documents/appls_mydocs/PortableApps/MSYS2Portable/App/msys32/mingw64/lib/python3.8/site-packages
$ cygpath -w /c/Users/user1/Documents/appls_mydocs/PortableApps/MSYS2Portable/App/msys32/mingw64/lib/python3.8
C:\Users\user1\Documents\appls_mydocs\PortableApps\MSYS2Portable\App\msys32\mingw64\lib\python3.8
$ cygpath -w /c/Users/user1/Documents/appls_mydocs/PortableApps/MSYS2Portable/App/msys32/mingw64/lib/python3.8/site-packages
C:\Users\user1\Documents\appls_mydocs\PortableApps\MSYS2Portable\App\msys32\mingw64\lib\python3.8\site-packages
$ which python
/usr/bin/python

我似乎有两个不完整/损坏的Python安装(3.7、3.8)。 我不知道是什么导致了“不完整”的升级。 几个观察结果如下所示(见下面的代码):
  1. python 指向 3.7

  2. readline 可用于 3.7,但不可用于 3.8。 我不知道为什么。

  3. pandas(以及许多其他库)可用于 3.8,但不能用于 3.7。 其中许多在 3.8 中无法导入,因为缺少依赖项(我猜在 3.7 中可用)。 我不知道为什么。

  4. python3.8 报告 .pythonrc 的位置为 Windows 格式,而 3.7 报告为 Cygwin 格式。 这正常吗?

  5. 删除 PYTHONPATH 也没有帮助。

$ unset PYTHONPATH
$ python3.8
Python 3.8.2 (default, Apr  9 2020, 13:17:39)  [GCC 9.3.0 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
Reading C:/Users/user1/Documents/appls_mydocs/PortableApps/MSYS2Portable/App/msys32/home/user1/.pythonrc
Module readline not available.
Traceback (most recent call last):
  File "C:/Users/user1/Documents/appls_mydocs/PortableApps/MSYS2Portable/App/msys32/home/user1/.pythonrc", line 42, in <module>
    del os, atexit, readline, rlcompleter, save_history, historyPath
NameError: name 'readline' is not defined
>>> import pandas
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:/Users/user1/Documents/appls_mydocs/PortableApps/MSYS2Portable/App/msys32/mingw64/lib/python3.8/site-packages/pandas/__init__.py", line 16, in <module>
    raise ImportError(
ImportError: Unable to import required dependencies:
numpy: DLL load failed while importing _ctypes: No se puede encontrar el módulo especificado.
>>> exit()
Error in atexit._run_exitfuncs:
Traceback (most recent call last):
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 973, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'readline'
$ python
Python 3.7.4 (default, Jul 11 2019, 10:29:54)
[GCC 9.1.0] on msys
Type "help", "copyright", "credits" or "license" for more information.
Reading /home/user1/.pythonrc
readline is in /usr/lib/python3.7/lib-dynload/readline.cpython-37m.dll
>>> import pandas
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'pandas'
>>> exit()

编辑 #4:

我检查了所有的Python包,发现了一些奇怪的东西。似乎基本的Python安装包括两个独立的包,一个是mingw64,另一个是msys。我不知道每个包都做什么。

$ pacman -Sl | grep "python" | grep "installed"
...
mingw64 mingw-w64-x86_64-python 3.8.2-2 [installed]
...
msys python 3.8.2-1 [installed: 3.7.4-1]
...

一方面,mingw64(3.8.2-2)与msys(3.7.4-1)的安装版本不匹配。另一方面,两者可用的子版本并不完全相同(3.8.2-2)与(3.8.2-1)。无论如何,我继续升级msys python,这显著解决了问题。
$ pacman -S python
...
$ python
Python 3.8.2 (default, Apr 16 2020, 15:31:48)
[GCC 9.3.0] on msys
Type "help", "copyright", "credits" or "license" for more information.
Reading /home/user1/.pythonrc
Traceback (most recent call last):
  File "/home/user1/.pythonrc", line 9, in <module>
    import readline
  File "/c/Users/user1/Documents/appls_mydocs/PortableApps/MSYS2Portable/App/msys32/mingw64/lib/python3.8/site-packages/readline.py", line 6, in <module>
    from pyreadline.rlmain import Readline
  File "/c/Users/user1/Documents/appls_mydocs/PortableApps/MSYS2Portable/App/msys32/mingw64/lib/python3.8/site-packages/pyreadline/__init__.py", line 12, in <module>
    from . import logger, clipboard, lineeditor, modes, console
  File "/c/Users/user1/Documents/appls_mydocs/PortableApps/MSYS2Portable/App/msys32/mingw64/lib/python3.8/site-packages/pyreadline/clipboard/__init__.py", line 13, in <module>
    from .win32_clipboard import GetClipboardText, SetClipboardText
  File "/c/Users/user1/Documents/appls_mydocs/PortableApps/MSYS2Portable/App/msys32/mingw64/lib/python3.8/site-packages/pyreadline/clipboard/win32_clipboard.py", line 37, in <module>
    import ctypes.wintypes as wintypes
  File "/c/Users/user1/Documents/appls_mydocs/PortableApps/MSYS2Portable/App/msys32/mingw64/lib/python3.8/ctypes/wintypes.py", line 20, in <module>
    class VARIANT_BOOL(ctypes._SimpleCData):
ValueError: _type_ 'v' not supported
Failed calling sys.__interactivehook__
Traceback (most recent call last):
  File "/c/Users/user1/Documents/appls_mydocs/PortableApps/MSYS2Portable/App/msys32/mingw64/lib/python3.8/site.py", line 412, in register_readline
    import readline
  File "/c/Users/user1/Documents/appls_mydocs/PortableApps/MSYS2Portable/App/msys32/mingw64/lib/python3.8/site-packages/readline.py", line 6, in <module>
    from pyreadline.rlmain import Readline
  File "/c/Users/user1/Documents/appls_mydocs/PortableApps/MSYS2Portable/App/msys32/mingw64/lib/python3.8/site-packages/pyreadline/__init__.py", line 12, in <module>
    from . import logger, clipboard, lineeditor, modes, console
  File "/c/Users/user1/Documents/appls_mydocs/PortableApps/MSYS2Portable/App/msys32/mingw64/lib/python3.8/site-packages/pyreadline/clipboard/__init__.py", line 13, in <module>
    from .win32_clipboard import GetClipboardText, SetClipboardText
  File "/c/Users/user1/Documents/appls_mydocs/PortableApps/MSYS2Portable/App/msys32/mingw64/lib/python3.8/site-packages/pyreadline/clipboard/win32_clipboard.py", line 37, in <module>
    import ctypes.wintypes as wintypes
  File "/c/Users/user1/Documents/appls_mydocs/PortableApps/MSYS2Portable/App/msys32/mingw64/lib/python3.8/ctypes/wintypes.py", line 20, in <module>
    class VARIANT_BOOL(ctypes._SimpleCData):
ValueError: _type_ 'v' not supported

现在我已经在3.8中安装了readline。但是在加载.pythonrc时会出现另一个问题。

此外,还存在一个numpy的问题。 这不是由于Python版本引起的(/usr/bin/python现在指向3.8)。

$ python --version
Python 3.8.2
$ python
...
>>> import numpy
Traceback (most recent call last):
  File "/c/Users/user1/Documents/appls_mydocs/PortableApps/MSYS2Portable/App/msys32/mingw64/lib/python3.8/site-packages/numpy/core/__init__.py", line 24, in <module>
    from . import multiarray
  File "/c/Users/user1/Documents/appls_mydocs/PortableApps/MSYS2Portable/App/msys32/mingw64/lib/python3.8/site-packages/numpy/core/multiarray.py", line 14, in <module>
    from . import overrides
  File "/c/Users/user1/Documents/appls_mydocs/PortableApps/MSYS2Portable/App/msys32/mingw64/lib/python3.8/site-packages/numpy/core/overrides.py", line 7, in <module>
    from numpy.core._multiarray_umath import (
ModuleNotFoundError: No module named 'numpy.core._multiarray_umath'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/c/Users/user1/Documents/appls_mydocs/PortableApps/MSYS2Portable/App/msys32/mingw64/lib/python3.8/site-packages/numpy/__init__.py", line 142, in <module>
    from . import core
  File "/c/Users/user1/Documents/appls_mydocs/PortableApps/MSYS2Portable/App/msys32/mingw64/lib/python3.8/site-packages/numpy/core/__init__.py", line 54, in <module>
    raise ImportError(msg)
ImportError:

IMPORTANT: PLEASE READ THIS FOR ADVICE ON HOW TO SOLVE THIS ISSUE!

Importing the numpy c-extensions failed.
- Try uninstalling and reinstalling numpy.
- If you have already done that, then:
  1. Check that you expected to use Python3.8 from "/usr/bin/python.exe",
     and that you have no directories in your PATH or PYTHONPATH that can
     interfere with the Python and numpy version "1.18.3" you're trying to use.
  2. If (1) looks fine, you can open a new issue at
     https://github.com/numpy/numpy/issues.  Please include details on:
     - how you installed Python
     - how you installed numpy
     - your operating system
     - whether or not you have multiple versions of Python installed
     - if you built from source, your compiler versions and ideally a build log

- If you're working with a numpy git repository, try `git clean -xdf`
  (removes all files not under version control) and rebuild numpy.

Note: this error has many possible causes, so please don't comment on
an existing issue about this - open a new one instead.

Original error was: No module named 'numpy.core._multiarray_umath'

编辑 #5 根据 @a_guest 的建议并指向了 "安装 PyReadline 后出现“ValueError:_type_ 'v'不受支持”错误,我删除了pyreadline,这个问题已经解决。

现在唯一剩下的问题似乎是 numpy 无法加载,可能(但不一定)是由于存在两个 Python 3.8 系统。

因此,现在的问题是:Msys2:两个 Python 安装?


确实非常奇怪。尝试将Python切换回Python 3.7,然后执行 python -m pip install pandas 命令-- 然后看看是否有效。 - xilpex
这可能对事后并不特别有帮助,但这就是为什么您应该将系统Python问题与项目问题分开处理的原因。您可能不应该使用系统软件包管理器来安装您日常使用所需的Python软件包。这基本上是为什么您不应该在系统安装的Python版本上使用pip的相同原因。相反,您应该使用虚拟环境。尝试使用pacman卸载或重新安装/更新您的Python软件包。 - sytech
@sytech - 就概念而言,我想这个问题与Python系统范围与用户级别(或项目级别、环境级别)软件包不同。这种偏离主题的讨论通常很有趣,但并不影响当前状态或行动路线。 在实际操作方面,我将看看如何进行卸载/安装。 - sancho.s ReinstateMonicaCellio
你尝试过使用pip升级所有的Python包吗?通常当我升级Python时,这样做可以解决我的问题。更多信息请参考:https://dev59.com/KXE85IYBdhLWcg3wikS- - Nimin Unnikrishnan
@NiminUnnikrishnan - 我没有这样做。我可能会尝试这样做,先备份我的便携式Msys2。 - sancho.s ReinstateMonicaCellio
显示剩余15条评论
1个回答

13
ImportError: cannot import name 'open_code' from 'io' (unknown location)错误是由于两个不同版本的Python相互冲突导致的。虽然PYTHONPATH已更新为指向新的3.8版本,但python仍然指向旧版本3.7。根据PYTHONPATH文档说明,它会被添加到模块搜索路径的前面,因此会覆盖任何内置模块。您可以通过创建两个不同的虚拟环境并在其中一个上启动时让PYTHONPATH指向另一个来重现该行为。下面我使用Miniconda创建了两个不同的环境py37py38,分别包含3.7和3.8安装。
(py37) user@pc:~$ python --version
Python 3.7.6
(py37) user@pc:~$ PYTHONPATH=~/miniconda3/envs/py38/lib/python3.8/ python
Fatal Python error: init_sys_streams: can't initialize sys standard streams
Traceback (most recent call last):
  File "/home/user/miniconda3/envs/py38/lib/python3.8/io.py", line 54, in <module>
ImportError: cannot import name 'open_code' from 'io' (unknown location)
Aborted (core dumped)

这是一系列行动中的第一步,逐步解决问题。 我仍然有问题,并且我发布了额外的问题。 https://dev59.com/rbroa4cB1Zd3GeqPmIns https://stackoverflow.com/questions/61390715/msys2-readline-in-two-python-installations - sancho.s ReinstateMonicaCellio
我不清楚如何解决您所提到的问题。你有什么解决方案可以提出吗? - Kosmylo
@Kosmylo 如果这个答案没有解决您的问题,请发布一个新问题。然后您可以在此处链接它。 - a_guest
+1 我一直在尝试使用Automator创建一个应用程序来启动我的python Web服务器。它会触发一个简单的bash脚本来设置环境,然后继续启动python。在启动时一直遇到异常,直到阅读了这个提示。即使这是一个干净的python安装,显然有2个版本的python可用。当我在启动脚本中使用完整的python3路径时,服务器运行得非常完美。赞! - horace

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