Ошибка установки python-dev: ImportError: нет модуля с именем apt_pkg

95

Я пользователь Debian и хочу установить python-dev, но когда я запускаю код в оболочке от имени пользователя root:

# aptitude install python-dev

Я получаю следующую ошибку:

Traceback (most recent call last):       
  File "/usr/bin/apt-listchanges", line 28, in <module>
    import apt_pkg
ImportError: No module named apt_pkg

В чем проблема и как ее решить?

Бельфегор
источник
1
похоже, что ваш apt ist сломан, что происходит, когда вы пытаетесь apt-get install python-dev
Пьер Гейер
Когда я пытаюсь установить python-dev с помощью apt-get, он говорит, что он уже установлен: Чтение списков пакетов ... Готово Построение дерева зависимостей Чтение информации о состоянии ... Готово python-dev уже является новейшей версией. 0 обновлено, 0 установлено заново, 0 удалено и 0 не обновлено. Есть другие предложения?
Бельфегор

Ответы:

63

Убедитесь, что у вас есть рабочий пакет python-apt. Вы можете попробовать удалить и установить этот пакет еще раз, чтобы решить проблему с отсутствием местонахождения apt_pkg.so.

apt-get install python-apt
Арнестиг
источник
Он уже установлен. Когда я нажимаю: # apt-get install python-apt, он дает мне Чтение списков пакетов ... Готово Построение дерева зависимостей Чтение информации о состоянии ... Готово python-apt - это уже самая новая версия. 0 обновлено, 0 установлено заново, 0 удалено и 0 не обновлено. И когда я снова пытаюсь использовать: # aptitude install python-dev, я снова получаю ту же ошибку. Еще несколько идей, что мне делать?
Бельфегор
14
удалите его с помощью apt-get remove --purge python-aptи установите снова
Arnestig 05
8
Помните о других зависимостях. Я удалил пакет (тоже) быстро в Ubuntu, и многие другие зависимости были также удалены (например, ubuntu-desktop). Однако это моя вина, что я не обращаю внимания на записи в журнале.
Al R.
1
Не совсем уверен, было ли это из-за python-apt. Посмотрите на packages.ubuntu.com/lucid/ubuntu-desktop зависимости от ubuntu-desktop.
Arnestig
2
@Arnestig REMOVING python-aptзвучит довольно опасно !! Один раз усвоил урок и не буду его пробовать.
alvas
140

Я столкнулся с этой проблемой при выполнении sudo apt-get update. Мой env - debian8 с python2.7 + 3.4 (по умолчанию) + 3.5.

Следующий код воссоздает только apt_pkg....soфайл для python 3.5.

sudo apt-get install python3-apt --reinstall

Следующий код решил мою проблему,

cd /usr/lib/python3/dist-packages
sudo ln -s apt_pkg.cpython-{35m,34m}-x86_64-linux-gnu.so

Итак, очевидно, что python3-apt проверяет самую высокую версию python вместо текущей используемой версии python.

жажа
источник
27
sudo ln -s apt_pkg.cpython-{35m,34m}-x86_64-linux-gnu.soследует изменить на sudo ln -s apt_pkg.cpython-{35m,34m}-x86_64-linux-gnu.so apt_pkg.so
desaiankitb
38
Ты великолепен! Для меня это было sudo ln -s apt_pkg.cpython-{35m,36m}-x86_64-linux-gnu.soдля python3.6, и теперь эта ужасная ошибка исчезла.
Alex Gurrola
54
После установки Python 3.7 Следующий по умолчанию 3.6 в Ubuntu 18.04 с sudo apt install python3.7я получил эту ошибку apt_pkg пытается запустить пип, так что мне нужно бежать , cd /usr/lib/python3/dist-packagesто sudo ln -s apt_pkg.cpython-{36m,37m}-x86_64-linux-gnu.soпотом sudo apt install python3-pip.
abulka
3
для python 3.6 команда будетsudo ln -s apt_pkg.cpython-{35m,36m}-x86_64-linux-gnu.so
StatguyUser
1
Эти фигурные скобки не являются собственностью команды ln. Они вызывают расширение скобок оболочки, см. Gnu.org/software/bash/manual/html_node/Brace-Expansion.html
Карлос А. Ибарра,
113

Решите это следующим образом:

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

Или:

/usr/lib/python3/dist-packages# cp apt_pkg.cpython-35m-x86_64-linux-gnu.so apt_pkg.so

В основном, если вы получаете No such file or directoryпросто, lsчтобы попытаться получить правильное имя.

user8178061
источник
Отлично работает
Subhrajyoti Sen
3
В Ubuntu 18.04 используйте этот $ cd / usr / lib / python3 / dist-packages $ sudo cp apt_pkg.cpython-36m-x86_64-linux-gnu.so apt_pkg.so
Нарен Еллавула
Это сработало и для меня ... Я перечислил все файлы на странице /usr/lib/python3/dist-packagesи увидел, что у меня нет apt_pkg.cpython-34m-i386-linux-gnu.soили apt_pkg.cpython-3m-i386-linux-gnu.so, но у меня есть apt_pkg.cpython-36m-i386-linux-gnu.so... Я скопировал этот файл apt_pkg.soи отлично работал! Благодарность!
Леонардо Иссо
Это сработало и для меня. Как и @LeonardoIsso, я также перечислил все файлы, чтобы найти правильное имя файла, потому что я использую 32-битный Linux.
w3Разработано
59

Это случилось со мной в Ubuntu 18.04.2 после того, как я попытался установить Python3.7 из репозитория deadsnakes.

Решение было это

1) cd /usr/lib/python3/dist-packages/

2) sudo ln -s apt_pkg.cpython-36m-x86_64-linux-gnu.so apt_pkg.so

Зеркало Мираж
источник
3
Просто хотел подтвердить другим, что это действительно сработало для меня.
AnthonyD973
2
это безумие, спасибо! Когда в докере:RUN ln -s /usr/lib/python3/dist-packages/apt_pkg.cpython-36m-x86_64-linux-gnu.so /usr/lib/python3/dist-packages/apt_pkg.so
loretoparisi
2
Да, это было решение :)
szedjani
1
это решение! После обновления до Python 3.7.
ИОАНН
1
18.04.04, обновление до Python 3.7, и это тоже сработало для меня! Благодарность!!
RJaus
18

Эта ошибка часто возникает, когда более новая версия python была установлена ​​вместе со старой версией, например;

  • Ubuntu 18.04.1 поставляется с Python версии 3.6.6
  • Установлен ppa: deadsnakes / python3.7.1 или альтернатива
  • Запустите команду, использующую модуль apt_pkg, и получите сообщение об ошибке, например:

        from CommandNotFound.db.db import SqliteDatabase
    File "/usr/lib/python3/dist-packages/CommandNotFound/db/db.py", line 5, in <module>
        import apt_pkg
    

Когда мы устанавливаем версию python3, не являющуюся дистрибутивом, с помощью apt, она устанавливает общий каталог модуля как каталог python3, как правило, так и будет /usr/lib/python3.

В большинстве случаев это будет нормально, но в некоторых случаях разные версии python полагаются на разные библиотеки или общие объекты / библиотеки, чем другая версия python, поэтому, как указывали другие ответы, нам нужно связать .SO с правильная версия python. Итак, если у нас установлен python3.6 в 64-битной системе, тогда ссылка apt_pkg .SO будет

sudo ln -s apt_pkg.cpython-36m-x86_64-linux-gnu.so apt_pkg.so

Но проблема заключается в том, что когда мы устанавливаем более новую версию python, ссылка обновляется и указывает на новейшую версию python, что приводит к тому, что модуль apt_pkg не обнаруживается. Проверив, какая версия python поставляется с вашим дистрибутивом, вы можете создать ссылку, как показано выше. Или мы используем метод, чтобы предложить команде выбор версий Python для связывания .SO, например:

sudo ln -s apt_pkg.cpython-{36m,35m,34m}-x86_64-linux-gnu.so apt_pkg.so

Поскольку python создаст эту ссылку на новейшую установленную версию python, мы даем команде возможность выбрать одну из трех версий python, из которых она выберет самую высокую версию.

Джейми Линдси
источник
2
При запуске 18.04.2 ваша первая рекомендация сработала для меня, и я наконец смог запустить обновление sudo apt-get без ошибок. Ваша вторая рекомендация возвращает ошибку о том, что apt-get.so не является папкой.
CloseISQ
15

Решение @ user8178061 работало хорошо, но я сделал это с некоторыми изменениями для моей версии, которая связана python3.7с Ubuntu.

Я заменил apt_pkg.cpython-3m-i386-linux-gnu.soсapt_pkg.cpython-36m-x86_64-linux-gnu.so

Вот две команды для выполнения:

cd /usr/lib/python3/dist-packages

sudo cp apt_pkg.cpython-36m-x86_64-linux-gnu.so apt_pkg.so

Хьюго Сом
источник
1
Это устранило мою проблему. Это решает проблему, если она была вызвана переключением версии Python с 3.6 на 3.7.
JThistle 05
1
Спасибо, была такая же проблема! Подумайте об использовании, sudo ln -s apt_pkg.cpython-36m-x86_64-linux-gnu.so apt_pkg.soчтобы было понятно, что apt_pkg.soесть.
Сципион
Сработало, но мне sudo cp apt_pkg.cpython-37m-x86_64-linux-gnu.so apt_pkg.soпо какой-то причине пришлось поменять на
Даниэль
8

Это сработало для меня после обновления python3.7 на ubuntu18.04

cd /usr/lib/python3/dist-packages
sudo cp apt_pkg.cpython-36m-x86_64-linux-gnu.so apt_pkg.so
астха
источник
1
Это сработало для меня после обновления python 3.8 на ubuntu18.04.
Генри Паласиос
6

По какой-то причине моя установка отсутствовала apt_pkg.soв каталоге dist-packages python3. ( apt_pkg.cpython-33m-x86_64-linux-gnu.soтам было ?!), но и мне пришлось сделать символическую ссылку apt_pkg.so -> apt_pkg.cpython-33m-x86_64-linux-gnu.so в/usr/lib/python3/dist-packages

Я не уверен, было ли мое обновление неработающим или почему это произошло. Это произошло после попытки обновления (точное-> редкое-> количественное обновление)

Джейми Пейт
источник
Для меня это было правильным исправлением. Я вызвал эту проблему, используя pip3 как root, хотя я знал, что это плохая идея. Я хотел увидеть, как сильно я буду шокирован, если засуну палец в розетку. Ответ: очень плохо. Также возиться с настройкой / etc / alternatives - не для чести. Не для тех, кто работает неполный рабочий день. Я думаю, что переход по ссылке на python указывал на то, какой python был проблемой, которая привела меня к катастрофе.
pauljohn32
6
  1. Проверьте версию Python 3 по умолчанию:
python --version
Python 3.7.5
  1. cdв /usr/lib/python3/dist-packagesи проверьте apt_pkg.*файлы. Вы обнаружите, что для вашей версии Python по умолчанию его нет:
ll apt_pkg.*
apt_pkg.cpython-36m-x86_64-linux-gnu.so
  1. Создайте символическую ссылку:
sudo ln -s apt_pkg.cpython-36m-x86_64-linux-gnu.so apt_pkg.cpython-37m-x86_64- linux-gnu.so 
Нико Шлёмер
источник
5

В крайнем sudo cp /usr/lib/python3/dist-packages/apt_pkg.cpython-35m-x86_64-linux-gnu.so /usr/lib/python3/dist-packages/apt_pkg.cpython-36m-x86_64-linux-gnu.so случае, если lnкоманда слишком много для вас или каким-то волшебным образом не работает.

cpвыше также может быть, mvесли вы используете только одну версию Python.

Тонг Ню
источник
4

если вы используете python 3.7, понизьте его до python 3.6, обновив альтернативы, это сработало для меня

sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 1

sudo update-alternatives --config python3
Вирен Патель
источник
Это сработало для меня с python3.6, но когда я вернусь к python3.7, ошибка все еще существует
Hugo Sohm
3

Если вы используете python 3.5, понизьте до 3.4. Это самый безопасный ход.

Ниже /usr/lib/python3/dist-packagesвы увидите, *34m*какой python 3.5 нельзя использовать. жажа ответь символьной ссылкой на него.

Побе
источник
как понизить его?
Pynchia
почему понижение рейтинга самый безопасный актин?
Дэвид
3

Помимо создания символьной ссылки apt_pkg.so, вы можете создать apt_inst.soтаким же образом apt_pkg.so.

ln -s apt_inst.cpython-35m-x86_64-linux-gnu.so apt_inst.so 
Джихван Парк
источник
1

Я вижу, что все говорят, как исправить это странным копированием и т. Д., Но никто не сказал, почему возникает проблема.

Итак, позвольте мне объяснить для тех из вас, кто, как я, не хочет связываться с системными файлами только потому, что им так сказал кто-то из SO.


Проблема в том, что:

  • во многих системных скриптах жестко запрограммирован python3 shebang. Можете проверить сами:
~$ grep -R "\#\!/usr/bin/python3" /usr/lib/*

/usr/lib/cnf-update-db:#!/usr/bin/python3
/usr/lib/command-not-found:#!/usr/bin/python3
/usr/lib/cups/filter/pstotiff:#!/usr/bin/python3
/usr/lib/cups/filter/rastertosag-gdi:#!/usr/bin/python3 -u
grep: /usr/lib/cups/backend/cups-brf: Permission denied
/usr/lib/cups/backend/hpfax:#!/usr/bin/python3
/usr/lib/language-selector/ls-dbus-backend:#!/usr/bin/python3
/usr/lib/python3/dist-packages/language_support_pkgs.py:#!/usr/bin/python3
/usr/lib/python3/dist-packages/softwareproperties/MirrorTest.py:#!/usr/bin/python3
/usr/lib/python3/dist-packages/cupshelpers/installdriver.py:#!/usr/bin/python3
/usr/lib/python3/dist-packages/cupshelpers/openprinting.py:#!/usr/bin/python3
/usr/lib/python3/dist-packages/cupshelpers/xmldriverprefs.py:#!/usr/bin/python3
/usr/lib/python3/dist-packages/cupshelpers/smburi.py:#!/usr/bin/python3
/usr/lib/python3/dist-packages/cupshelpers/ppds.py:#!/usr/bin/python3
/usr/lib/python3/dist-packages/cupshelpers/debug.py:#!/usr/bin/python3
/usr/lib/python3/dist-packages/DistUpgrade/dist-upgrade.py:#!/usr/bin/python3
/usr/lib/python3/dist-packages/CommandNotFound/db/creator.py:#!/usr/bin/python3
/usr/lib/python3/dist-packages/CommandNotFound/db/db.py:#!/usr/bin/python3
/usr/lib/python3/dist-packages/Quirks/quirkreader.py:#!/usr/bin/python3
grep: /usr/lib/ssl/private: Permission denied
/usr/lib/system-service/system-service-d:#!/usr/bin/python3
/usr/lib/ubuntu-release-upgrader/check-new-release-gtk:#!/usr/bin/python3
/usr/lib/ubuntu-release-upgrader/do-partial-upgrade:#!/usr/bin/python3
/usr/lib/ubuntu-release-upgrader/check-new-release:#!/usr/bin/python3
/usr/lib/update-notifier/package-data-downloader:#!/usr/bin/python3
/usr/lib/update-notifier/backend_helper.py:#!/usr/bin/python3
/usr/lib/update-notifier/apt_check.py:#!/usr/bin/python3
/usr/lib/update-notifier/apt-check:#!/usr/bin/python3

  • пакет python apt python-apt/ python3-aptявляется системным пакетом, поэтому он для системного python по умолчанию

Таким образом, скрипты всегда будут получать версию, с которой в настоящее время связана ссылка python3, но не смогут, потому что пакет apt отсутствует.


Общее решение: НИКОГДА не меняйте python3ссылку по умолчанию . Когда-либо. Это также относится к pythonссылке - если приложение было написано на Python2 с некоторыми старыми элементами синтаксиса, которые не работают в Python3, приложение не будет работать.

[Мой терминал сломался, потому что я использую Terminator, который явно написан на Python2.7, несовместимом с Python3.]


Представленные здесь решения предлагают либо скопировать / связать файлы пакета apt, либо изменить python3ссылку.

Давайте проанализируем оба:

  1. Копирование / связывание пакета apt

Это не должно быть проблемой, потому что все скрипты Python3.4 работают и с более новыми версиями.

Уже. Но он может сломаться в будущем - если вы будете поддерживать свою систему достаточно долго.

  1. Изменение python3ссылки назад

Это отличное решение, потому что мы можем вернуться к тому, чтобы «никогда не менять ссылку».


"Но мне нравится просто печатать python!" - Мне тоже это нравится! Вот как я вообще дошел до этой проблемы!

  1. В общем, вам следует избегать ручного изменения системных ссылок - используйте update-alternativesвместо этого для связывания разных версий . Это применимо к любому приложению с множеством версий. Это по-прежнему нарушает эти системные сценарии (потому что это действительно меняет ссылку), но вы можете легко переключаться туда и обратно, не беспокоясь о том, поместили ли вы ссылку и адрес в правильном порядке или допустили опечатку.

  2. Рассмотрите возможность использования другого имени, чем python/ python3для вашей ссылки или псевдонима.

  3. Или добавьте свою python/ python3ссылку в PATH (как это делают виртуальные среды), не изменяя системные ссылки.

h4z3
источник
0

Windows 10 WSL v1 (Ubuntu 16.04.6 LTS)

Этот ответ Reddit (слегка измененный сработал для меня)

sudo ln -sfn /usr/lib/python3/dist-packages/apt_pkg.cpython-35m-x86_64-linux-gnu.so apt_pkg.so

Лео Ферз-Вэддок
источник
0

Ни один из ответов не помог мне (я использую Ubuntu 16.04 и Python 3.6). Итак, я наконец решил проблему следующим образом:

1- подключиться к FTP сервера

2- заходим в папку «/ usr / lib / python3 / dist-packages /»

3- продублируйте файл «apt_pkg.cpython-3 5 m-x86_64-linux-gnu.so»

4- переименуйте этот дублированный файл в «apt_pkg.cpython-3 6 m-x86_64-linux-gnu.so»

Это оно!

Хулио С.
источник
0

Я использую Ubuntu 16.04 и обновился до Python 3.7. Вот ошибка, которая возникла при попытке добавить PPA

    sudo add-apt-repository ppa:ubuntu-toolchain-r/test                                           
Traceback (most recent call last):
  File "/usr/bin/add-apt-repository", line 11, in <module>
    from softwareproperties.SoftwareProperties import SoftwareProperties, shortcut_handler
  File "/usr/lib/python3/dist-packages/softwareproperties/SoftwareProperties.py", line 27, in <module>
    import apt_pkg
ModuleNotFoundError: No module named 'apt_pkg'

Мне удалось исправить эту ошибку, создав символическую ссылку с моим исходным python 3.4 apt_pkg.cpython-34m-x86_64-linux-gnu.so, создав следующую символическую ссылку

sudo ln -s apt_pkg.cpython-34m-x86_64-linux-gnu.so apt_pkg.so
Гигаватт
источник
1
Похоже, что это решение уже было предложено как минимум в 6 других ответах на этот вопрос (и еще 3 просто предложили скопировать файл вместо символической ссылки).
Сергей Шубин,
это просто работает для меня, спасибо! Одна вещь - перед этим нам нужно cd / usr / lib / python3 / dist-packages
Hao Yellow,
-3

Пожалуйста, попробуйте исправить это, установив переменные локали:

export LC_ALL="en_US.UTF-8"

export LC_CTYPE="en_US.UTF-8"
Раджендра Шарма
источник
1
Постарайтесь быть более конкретным и объяснить, что делают эти две команды.
dpapadopoulos
-5

На всякий случай, если это поможет другому, я наконец решил эту проблему, которая, по-видимому, была вызвана конфликтами версий python, перенаправив ссылку python3, а затем перенаправив ее на нужную версию python:

sudo rm /usr/bin/python3
sudo ln -s /usr/bin/python3.4

Возможно, вам потребуется ввести правильную версию Python, найденную с помощью:

python3 -V
matthias2t
источник
2
удалить python3 - плохая идея :( если вы хотите ссылку на python 3.4, используйте: ln -s /usr/bin/python3.4 / usr / bin / python3
Pamungkas Jayuda
1
Никогда не рекомендуется говорить людям об удалении вещей из системы, если это действительно не нужно. К счастью, / usr / bin / python3 в любом случае обычно является просто символической ссылкой. Я действительно думаю, тебе стоит просто удалить этот ответ.
Джейми Линдси