Помилка встановлення python-dev: ImportError: Немає модуля з іменем apt_pkg


95

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

# 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 пошкоджений, що відбувається, коли ви намагаєтесь apt-get install python-dev
Pierre Geier

Коли я намагаюся за допомогою apt-get install python-dev, він каже, що він уже встановлений: Читання списків пакетів ... Готово Побудова дерева залежностей Читання інформації про стан ... Готово 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

8
Будьте в курсі інших залежностей. Я видалив пакет (занадто) швидко в Ubuntu, а також було видалено багато інших залежностей (наприклад, ubuntu-робочий стіл). Однак я винен у тому, що не звернув уваги на примітки в журналі.
Al R.

1
Не зовсім впевнений, чи це було пов’язано з python-apt. Подивіться на packages.ubuntu.com/lucid/ubuntu-desktop залежностей в Ubuntu-робочий стіл.
Арнестіг

2
@Arnestig REMOVING python-aptзвучить досить небезпечно !! Одного разу вивчив свій урок, і я не буду його пробувати.
alvas,

141

Я зіткнувся з цією проблемою, коли робив 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, що використовується.


28
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

39
Ти дивовижний! Для мене це було sudo ln -s apt_pkg.cpython-{35m,36m}-x86_64-linux-gnu.soдля python3.6, і цієї жахливої ​​помилки зараз немає.
Алекс Гуррола,

55
Після встановлення Python 3.7 поряд із типовою версією 3.6 в Ubuntu 18.04, коли sudo apt install python3.7я отримав цю помилку apt_pkg, намагаючись запустити pip, 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спробуєте отримати правильну назву.


Працює ідеально
Субхрайоті Сен

3
На Ubuntu 18.04 використовуйте цей $ cd / usr / lib / python3 / dist-пакети $ 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Розвивається

60

Це трапилося зі мною в 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, ми даємо команді можливість вибрати з 3 версій python, з яких вона вибере найвищу дану версію.


2
Запустивши 18.04.2, ваша перша рекомендація спрацювала для мене, і я, нарешті, міг запустити оновлення sudo apt-get без помилок. Ваша друга рекомендація повертає помилку з повідомленням, що apt-get.so не був папкою.
CloseISQ

15

Рішення @ user8178061 спрацювало добре, але я зробив це з деякими модифікаціями для моєї версії, яка стосується python3.7Ubuntu

Я замінив 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

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-пакетів 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

Я не впевнений, чи моє оновлення було зламане, чи чому це було так. Це сталося після спроби оновлення (точне-> raring-> кількісне оновлення)


Це було правильним виправленням для мене. Я спричинив цю проблему, використовуючи 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

3

Якщо ви використовуєте python 3.5, перейдіть до версії 3.4. Це найбезпечніший крок.

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


як це знизити?
Пінчія

чому зниження рівня найбезпечнішого актину?
Девід Медінець

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 всі сценарії python працюють і на новіших версіях.

Так далеко. Але це може зламатися в майбутньому - якщо ви будете тримати систему досить довго.

  1. Зміна python3зворотного посилання

Це чудове рішення, тому що ми можемо повернутися до "ніколи не змінюючи посилання"


"Але мені подобається друкувати просто python!" - Мені це теж подобається! Ось так я спочатку дійшов до цієї проблеми!

  1. Загалом, слід уникати ручної зміни системних посилань - update-alternativesзамість цього використовуйте для зв’язування різних версій . Це стосується будь-якої програми з багатьма версіями. Це все одно порушить ці системні сценарії (оскільки це змінює посилання), але ви можете легко перемикатись туди-сюди, не турбуючись про те, чи правильно ви розмістили посилання та призначення чи зробили помилку.

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

  3. Або додайте своє власне python/ python3посилання до PATH (як і віртуальне середовище), не змінюючи системних посилань.




0

Жодна з відповідей не спрацювала для мене (я використовую Ubuntu 16.04 та Python 3.6). Тож я нарешті вирішив проблему наступним чином:

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

2- перейдіть до папки "/ usr / lib / python3 / dist-пакети /"

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-пакети
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

2
видалити python3 - погана ідея :( якщо ви хочете посилання на python 3.4, використовуйте: ln -s /usr/bin/python3.4 / usr / bin / python3
Pamungkas Jayuda

1
Ніколи не є гарною ідеєю говорити людям прибирати речі з цієї системи, якщо це дійсно не потрібно. На щастя / usr / bin / python3, як правило, у будь-якому випадку є лише символічним посиланням. Я справді думаю, що вам слід просто видалити цю відповідь.
Джеймі Ліндсі,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.