ModuleNotFoundError в трассировках с Python3.6 на linux

I установил Python 3.6 на Ubuntu 16.04 с помощью Jonathon Fernyhough PPA:

sudo add-apt-repository ppa:jonathonf/python-3.6
sudo apt-get update
sudo apt-get install python3.6

Я создал строку, используя новую литераловую интерполяцию строк, но я предоставил неверный спецификатор формата. Я получил не только ожидаемый ValueError: Invalid format specifier, но и неожиданный ModuleNotFoundError: No module named 'apt_pkg'.

$ python3.6
Python 3.6.0 (default, Dec 29 2016, 21:40:36) 
[GCC 5.4.1 20161202] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> value = 4 * 20
>>> f'the value is {value:%A}'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: Invalid format specifier
Error in sys.excepthook:
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/apport_python_hook.py", line 63, in apport_excepthook
    from apport.fileutils import likely_packaged, get_recent_crashes
  File "/usr/lib/python3/dist-packages/apport/__init__.py", line 5, in <module>
    from apport.report import Report
  File "/usr/lib/python3/dist-packages/apport/report.py", line 30, in <module>
    import apport.fileutils
  File "/usr/lib/python3/dist-packages/apport/fileutils.py", line 23, in <module>
    from apport.packaging_impl import impl as packaging
  File "/usr/lib/python3/dist-packages/apport/packaging_impl.py", line 23, in <module>
    import apt
  File "/usr/lib/python3/dist-packages/apt/__init__.py", line 23, in <module>
    import apt_pkg
ModuleNotFoundError: No module named 'apt_pkg'

Original exception was:
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: Invalid format specifier

Я сообщил об этом в Python bug tracker. Там было отмечено, что:

Кажется, проблема поставщика не сама CPython. Эта же проблема также возникает и в Ubuntu 16.10 Python 3.6. Вызывать любое исключение может вызвать следующее:

Python 3.6.0b2 (default, Oct 11 2016, 05:27:10) 
[GCC 6.2.0 20161005] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> raise Exception
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
Exception
Error in sys.excepthook:
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/apport_python_hook.py", line 63, in apport_excepthook
    from apport.fileutils import likely_packaged, get_recent_crashes
  File "/usr/lib/python3/dist-packages/apport/__init__.py", line 5, in <module>
    from apport.report import Report
  File "/usr/lib/python3/dist-packages/apport/report.py", line 30, in <module>
    import apport.fileutils
  File "/usr/lib/python3/dist-packages/apport/fileutils.py", line 23, in <module>
    from apport.packaging_impl import impl as packaging
  File "/usr/lib/python3/dist-packages/apport/packaging_impl.py", line 23, in <module>
    import apt
  File "/usr/lib/python3/dist-packages/apt/__init__.py", line 23, in <module>
    import apt_pkg
ModuleNotFoundError: No module named 'apt_pkg'

Original exception was:
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
Exception
>>> 

Также см. https://bugs.launchpad.net/ubuntu/+source/python3.6/+bug/1631367.

Наконец, проблема была закрыта комментарием

Да, это, как представляется, инфраструктура отчетов об отказах поставщиков это не работает. Зачем им нужен отчет для каждой трассы на интерактивное приглашение вне меня, но похоже, что они пытаясь сделать.

Теперь мои вопросы:

  • Как интерпретировать этот комментарий? Является ли продавец в этом случае Джонатаном Фернихоу PPA? И он что-то изменил для кода Python, который он распространяет, чтобы он пытался отправить отчет для каждого исключения, которое создает трассировку?
  • Кому мне нужно уведомить или где мне нужно указать ошибку, чтобы решить эту проблему?

Ответ 1

После того, как я отправил этот вопрос в Stackoverflow, Барри А. Варшава сделал следующий комментарий для отслеживания проблем

Пожалуйста, поймите, что установка Python 3.6 из случайного PPA не обеспечивают полную поддержку этой версии интерпретатора. Python 3.6 еще не поддерживается в любой версии Ubuntu (который я предполагаю использовать), хотя мы работаем над этим для 17.04.

Очень часто вы можете установить новый пакет интерпретатора Python 3 и многие вещи будут работать, поскольку инфраструктура инфраструктуры Ubuntu чистые модули Python для всех установленных Python 3. Технически говоря, все они будут иметь/usr/lib/python3/dist-пакеты на своих sys.path, поэтому любой сторонний модуль pure-Python, созданный для поддержки версия Python 3 будет импортироваться любым (с пакетом) установленной версии Python 3.

Но это 1) далеко не означает, что эти сторонние модули будет работать; 2) не содержит пакетов, содержащих расширение C модули, которые необходимо перестроить для конкретной версии интерпретатора.

Поддержка новой версии Python - это долгий процесс, для которого мы только начало. Пожалуйста, свяжитесь с [email protected] для подробности.

Ubuntu устанавливает стандартный обработчик исключений, так что когда Python приложений и такого сбоя, мы можем собрать статистику сбоев, чтобы мы можем выделить ресурсы для устранения общих проблем и регрессий. apport (что вы видите в трассировке) - это отчет о сбоях инфраструктуры. apport вызывает apt_pkg, который является (С++) расширением модуль и, следовательно, не будет построен для версии Python 3.6 вы установили из этого PPA, если, конечно, владелец PPA (кто я не знаю) также выполнил архивирование Python 3 в архиве. Поскольку я в процессе настройки, и я знаю, что это немного работа, я сомневаюсь, что это было сделано для этого довольно случайного PPA.

Список рассылки ubuntu-devel - лучшее место для обсуждения текущих работайте над тем, чтобы Python 3.6 поддерживалась на Ubuntu.

Ответ 2

Я решил эту проблему для Python 3.6, сначала установив пакет python-apt для Python 3:

sudo apt install python3-apt

После этого я перешел в каталог dist-packages и скопировал apt_pkg[...].so в новое имя файла по умолчанию apt_pkg.so, которое также будет распознаваться Python 3.6:

cd /usr/lib/python3/dist-packages
sudo cp apt_pkg.cpython-34m-i386-linux-gnu.so apt_pkg.so

Теперь все ModuleNotFoundError: No module named 'apt_pkg' исключений не исчез в ожидаемых сообщениях об ошибках.

Ответ 3

Если ответ с наибольшим количеством голосов не работает, попробуйте выполнить следующие действия (имейте в виду, что вы должны изменить [версия]):

  1. выполните эту команду sudo apt install python3-apt
  2. перейти в каталог cd /usr/lib/python3/dist-packages
  3. запустите ls, чтобы найти правильную версию apt_pkg.cpython-[version]-i386-linux-gnu.so, в моем случае это была 35m
  4. создать символическую ссылку sudo cp apt_pkg.cpython-[version]-i386-linux-gnu.so apt_pkg.so НЕ ЗАБЫВАЙТЕ: введите свою [версию]

Troubleshouting

Если вы получили ошибку cp: cannot stat 'apt_pkg.cpython-[your-version]-i386-linux-gnu.so': No such file or directory, попробуйте следующие команды:

  1. rm -rf apt_pkg.so
  2. создать символическую ссылку sudo cp apt_pkg.cpython-[version]-i386-linux-gnu.so apt_pkg.so НЕ ЗАБЫВАЙТЕ: введите свою [версию]