Błąd instalacji python-dev: ImportError: Brak modułu o nazwie apt_pkg

100

Jestem użytkownikiem Debiana i chcę zainstalować python-dev, ale kiedy uruchamiam kod w powłoce jako root:

# aptitude install python-dev

Otrzymuję następujący błąd:

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

Co wydaje się być problemem i jak mogę go rozwiązać?

Belphegor
źródło
1
wygląda na to, że apt jest uszkodzony, co się dzieje, gdy próbujesz zainstalować apt-get python-dev
Pierre Geier,
Kiedy próbuję z apt-get install python-dev, pojawia się komunikat, że jest już zainstalowany: Czytanie list pakietów ... Gotowe Budowanie drzewa zależności Odczytywanie informacji o stanie ... Gotowe python-dev jest już najnowszą wersją. 0 zaktualizowanych, 0 nowo zainstalowanych, 0 do usunięcia i 0 niezaktualizowanych. Jakieś inne sugestie?
Belphegor,

Odpowiedzi:

64

Upewnij się, że masz działający pakiet python-apt. Możesz spróbować usunąć i ponownie zainstalować ten pakiet, aby rozwiązać problem z brakiem lokalizacji apt_pkg.so.

apt-get install python-apt
Arnestig
źródło
Jest już zainstalowany. Kiedy trafiam: # apt-get install python-apt daje mi Czytanie list pakietów ... Gotowe Budowanie drzewa zależności Odczytywanie informacji o stanie ... Gotowe python-apt jest już najnowszą wersją. 0 zaktualizowanych, 0 nowo zainstalowanych, 0 do usunięcia i 0 niezaktualizowanych. A kiedy spróbuję ponownie z: # aptitude install python-dev Znowu pojawia się ten sam błąd. Kilka innych pomysłów, co powinienem zrobić?
Belphegor
14
usuń go za pomocą apt-get remove --purge python-apti zainstaluj ponownie
Arnestig
8
Uważaj na inne zależności. Usunąłem pakiet (zbyt) szybko w Ubuntu i wiele innych zależności również zostało usuniętych (np. Ubuntu-desktop). Jednak to moja wina, że ​​nie zwracam uwagi na notatki w dzienniku.
Al R.
1
Nie jestem pewien, czy to z powodu python-apt. Zajrzyj na packages.ubuntu.com/lucid/ubuntu-desktop pod kątem zależności od ubuntu-desktop.
Arnestig,
3
@Arnestig USUWANIE python-aptbrzmi raczej niebezpiecznie !! Raz nauczyłem się lekcji i nie spróbuję.
alvas
143

Spotkałem ten problem podczas robienia sudo apt-get update. Mój env to debian8, z python2.7 + 3.4 (domyślnie) + 3.5.

Poniższy kod ponownie utworzy apt_pkg....soplik tylko dla języka Python 3.5

sudo apt-get install python3-apt --reinstall

Poniższy kod rozwiązał mój problem,

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

Więc oczywiście python3-apt sprawdza najwyższą wersję języka Python, zamiast bieżącej używanej wersji języka.

zhazha
źródło
29
sudo ln -s apt_pkg.cpython-{35m,34m}-x86_64-linux-gnu.sonależy zmienić na sudo ln -s apt_pkg.cpython-{35m,34m}-x86_64-linux-gnu.so apt_pkg.so
desaiankitb
39
Jesteś niesamowity! Dla mnie był to sudo ln -s apt_pkg.cpython-{35m,36m}-x86_64-linux-gnu.sopython3.6, a ten przerażający błąd już zniknął.
Alex Gurrola
56
Po zainstalowaniu Python 3.7 obok domyślnie w Ubuntu 18.04 3.6 z sudo apt install python3.7Dostałem ten błąd apt_pkg próbuje uruchomić pip, więc potrzebne do uruchomienia cd /usr/lib/python3/dist-packagesnastępnie sudo ln -s apt_pkg.cpython-{36m,37m}-x86_64-linux-gnu.sopotem sudo apt install python3-pip.
abulka
3
dla Pythona 3.6 polecenie będzie sudo ln -s apt_pkg.cpython-{35m,36m}-x86_64-linux-gnu.so
brzmiało
1
Te nawiasy klamrowe nie są właściwością polecenia ln. Wywołują
Carlos A. Ibarra
116

Rozwiąż to w ten sposób:

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

Lub:

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

Zasadniczo, jeśli masz ochotę No such file or directorytylko lsspróbować uzyskać właściwą nazwę.

user8178061
źródło
Działa idealnie
Subhrajyoti Sen
3
W Ubuntu 18.04 użyj tego $ cd / usr / lib / python3 / dist-packages $ sudo cp apt_pkg.cpython-36m-x86_64-linux-gnu.so apt_pkg.so
Naren Yellavula
U mnie też to zadziałało ... Wymieniłem wszystkie pliki na /usr/lib/python3/dist-packagesi zobaczyłem, że nie mam apt_pkg.cpython-34m-i386-linux-gnu.solub apt_pkg.cpython-3m-i386-linux-gnu.so, ale miałem apt_pkg.cpython-36m-i386-linux-gnu.so... Skopiowałem ten plik apt_pkg.soi działałem idealnie! Dzięki!
Leonardo Isso
To zadziałało również dla mnie. Podobnie jak @LeonardoIsso, wymieniłem również wszystkie pliki, aby znaleźć właściwą nazwę pliku, ponieważ korzystam z 32-bitowego systemu Linux.
w3 Rozwija się
66

Zdarzyło mi się to na Ubuntu 18.04.2 po tym, jak próbowałem zainstalować Python3.7 z repozytorium Deadsnakes.

Rozwiązanie było takie

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

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

Mirror Mirage
źródło
3
Chciałem tylko potwierdzić innym, że to naprawdę działa dla mnie.
Anthony D973
2
to szalone, dziękuję! Kiedy w 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
dockerze
2
Tak, to było rozwiązanie :)
szedjani
1
to jest rozwiązanie! Po aktualizacji do Pythona 3.7.
JAN,
1
18.04.04, aktualizacja do Pythona 3.7 i to też zadziałało! Dzięki!!
RJaus
23

Ten błąd często występuje, gdy nowsza wersja Pythona została zainstalowana razem ze starszą wersją, np.;

  • Ubuntu 18.04.1 jest dostarczany z wersją Pythona 3.6.6
  • Zainstalowany ppa: deadsnakes / python3.7.1 lub alternatywa
  • Uruchom polecenie korzystające z modułu apt_pkg i otrzymaj błąd, taki jak;

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

Kiedy zainstalujemy wersję python3 nie będącą dystrybucją za pomocą apt, ustawimy katalog współdzielonego modułu na katalog python3, którym zwykle będzie /usr/lib/python3.

W większości przypadków będzie to w porządku, ale w pewnych okolicznościach różne wersje Pythona zależą od innych bibliotek lub współdzielonych obiektów / bibliotek niż inne wersje Pythona, więc jak wskazywały inne odpowiedzi, musimy połączyć .SO z poprawna wersja Pythona. Więc jeśli mamy zainstalowany python3.6 w systemie 64-bitowym, to link apt_pkg .SO będzie

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

Ale problem polega na tym, że kiedy zainstalujemy nowszą wersję Pythona, odsyłacz zaktualizuje się, aby wskazywał najnowszą wersję Pythona, co prowadzi do błędu nie znalezienia modułu apt_pkg. Sprawdzając, która wersja Pythona jest dostarczana z twoją dystrybucją, możesz utworzyć łącze, jak pokazano powyżej. Lub używamy metody, aby zaoferować poleceniu wybór wersji Pythona do połączenia .SO, na przykład;

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

Ponieważ python utworzy odnośnik do najnowszej zainstalowanej wersji pythona, dajemy komendę możliwość wyboru spośród 3 wersji pythona, z których wybierze najwyższą podaną wersję.

Jamie Lindsey
źródło
2
Uruchomiono 18.04.2, Twoja pierwsza rekomendacja zadziałała i mogłem w końcu uruchomić aktualizację sudo apt-get bez żadnych błędów. Twoje drugie zalecenie zwróciło błąd informujący, że apt-get.so nie był folderem.
CloseISQ
16

Rozwiązanie @ user8178061 działało dobrze, ale zrobiłem to z pewnymi modyfikacjami dla mojej wersji, która jest python3.7z Ubuntu

I otrzymuje apt_pkg.cpython-3m-i386-linux-gnu.sozapt_pkg.cpython-36m-x86_64-linux-gnu.so

Tutaj dwa polecenia do wykonania:

cd /usr/lib/python3/dist-packages

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

Hugo Sohm
źródło
1
To rozwiązało mój problem. To rozwiązuje problem, jeśli był on spowodowany przełączeniem wersji Pythona z 3.6 na 3.7.
jumbot
1
Dzięki, miałem ten sam problem! Rozważ użycie, sudo ln -s apt_pkg.cpython-36m-x86_64-linux-gnu.so apt_pkg.soaby było jasne, co apt_pkg.soto jest.
Scipio
Działało, ale sudo cp apt_pkg.cpython-37m-x86_64-linux-gnu.so apt_pkg.soz jakiegoś powodu musiałem to zmienić
Daniel
10

To zadziałało dla mnie po aktualizacji Pythona3.7 na ubuntu18.04

cd /usr/lib/python3/dist-packages
sudo cp apt_pkg.cpython-36m-x86_64-linux-gnu.so apt_pkg.so
astha
źródło
1
To zadziałało dla mnie po aktualizacji Pythona 3.8 na Ubuntu18.04.
Henry Palacios
7

Z jakiegoś powodu brakowało mojej instalacji apt_pkg.sow katalogu dist-packages python3. ( apt_pkg.cpython-33m-x86_64-linux-gnu.sobył ?!), ale i musiałem utworzyć łącze symboliczne apt_pkg.so -> apt_pkg.cpython-33m-x86_64-linux-gnu.so w/usr/lib/python3/dist-packages

Nie jestem pewien, czy moja aktualizacja została zepsuta ani dlaczego tak się stało. Wystąpił po próbie aktualizacji (precyzyjne-> raring-> quantal upgrade)

Jamie Pate
źródło
To było dla mnie poprawne rozwiązanie. Spowodowałem ten problem, używając pip3 jako roota, mimo że wiedziałem, że to zły pomysł. Chciałem zobaczyć, jak bardzo byłbym zszokowany, gdybym włożył palec do gniazdka światła. Odpowiedź brzmi: całkiem zła. Również majstrowanie przy konfiguracji / etc / alternatives nie jest dla zmylenia. Nie dla każdego, kto jest gościem w niepełnym wymiarze godzin. Myślę, że przekroczenie tego, co wskazywało łącze Pythona, na którym Pythonie był problem, który zapoczątkował moją drogę do katastrofy.
pauljohn 32
6
  1. Sprawdź swoją domyślną wersję Pythona 3:
python --version
Python 3.7.5
  1. cddo /usr/lib/python3/dist-packagesi sprawdź apt_pkg.*pliki. Przekonasz się, że nie ma żadnego dla twojej domyślnej wersji Pythona:
ll apt_pkg.*
apt_pkg.cpython-36m-x86_64-linux-gnu.so
  1. Utwórz łącze symboliczne:
sudo ln -s apt_pkg.cpython-36m-x86_64-linux-gnu.so apt_pkg.cpython-37m-x86_64- linux-gnu.so 
Nico Schlömer
źródło
5

Ostatecznością jest sytuacja, 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 gdy lnpolecenie jest dla ciebie zbyt duże lub w jakiś magiczny sposób nie działa.

cppowyżej może być również, mvjeśli chcesz używać tylko jednej wersji Pythona.

Tong Niu
źródło
5

jeśli używasz pythona 3.7, obniż go do pythona 3.6, aktualizując alternatywy, to zadziałało dla mnie

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

sudo update-alternatives --config python3
Viren Patel
źródło
To zadziałało dla mnie z pythonem 3.6, ale kiedy powracam do python3.7, błąd nadal występuje
Hugo Sohm
3

Jeśli używasz Pythona 3.5, przejdź na starszą wersję 3.4. To najbezpieczniejszy ruch.

Poniżej /usr/lib/python3/dist-packageszobaczysz, *34m*którego Pythona 3.5 nie można używać. zhazha odpowiedz link symboliczny do niego.

Pobe
źródło
jak go obniżyć?
Pynchia
dlaczego obniżenie wersji jest najbezpieczniejszą aktyną?
David Medinets,
3

Oprócz tworzenia dowiązania symbolicznego dla apt_pkg.so, możesz chcieć zrobić apt_inst.sow ten sam sposób apt_pkg.so.

ln -s apt_inst.cpython-35m-x86_64-linux-gnu.so apt_inst.so 
Jihwan Park
źródło
3

Widzę, jak wszyscy mówią, jak to naprawić za pomocą dziwnego kopiowania itp., Ale nikt tak naprawdę nie powiedział, dlaczego problem występuje.

Pozwólcie, że wyjaśnię, tym z was, którzy tak jak ja nie chcą bawić się plikami systemowymi tylko dlatego, że ktoś im o tym powiedział.


Problemem jest:

  • wiele skryptów systemowych ma zakodowane na stałe w python3 shebang. Możesz to sprawdzić samodzielnie:
~$ 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 package python-apt/ python3-aptto pakiet systemowy, więc jest przeznaczony dla domyślnego systemu python

W ten sposób skrypty zawsze uzyskują wersję, do której aktualnie jest dowiązana python3, ale zawiodą, ponieważ nie ma pakietu apt.


Ogólne rozwiązanie: NIGDY nie zmieniaj domyślnego python3łącza. Zawsze. Dotyczy to równieżpython linku - jeśli aplikacja została napisana w Pythonie2 z niektórymi starymi elementami składni, które nie działają w Python3, aplikacja nie będzie działać.

[Mój terminal się zepsuł, ponieważ używam Terminatora, który najwyraźniej jest napisany w Pythonie2.7 niekompatybilnym z Python3.]


Przedstawione tutaj rozwiązania sugerują kopiowanie / łączenie plików pakietu apt lub zmianę python3łącza.

Przeanalizujmy oba:

  1. Kopiowanie / linkowanie pakietu apt

Nie powinno to stanowić problemu, ponieważ w okolicach Pythona 3.4 wszystkie skrypty Pythona działają również na nowszych wersjach.

Jak dotąd. Ale może się zepsuć w przyszłości - jeśli utrzymasz swój system wystarczająco długo.

  1. Zmiana python3łącza z powrotem

To świetne rozwiązanie, ponieważ możemy wrócić do „nigdy przenigdy nie zmieniać linku”


„Ale ja lubię pisać po prostu python!” - Też to lubię! Tak właśnie doszedłem do tego problemu!

  1. Ogólnie rzecz biorąc, należy unikać ręcznej zmiany łączy systemowych - update-alternativeszamiast tego używaj do łączenia różnych wersji . Dotyczy to każdej aplikacji z wieloma wersjami. To nadal spowoduje uszkodzenie skryptów systemowych (ponieważ zmienia łącze), ale możesz łatwo przełączać się tam i z powrotem, nie martwiąc się, czy umieścisz link i miejsce docelowe we właściwej kolejności, czy popełniłeś literówkę.

  2. Rozważ użycie innej nazwy niż python/ python3dla swojego łącza lub aliasu.

  3. Lub dodaj własne python/ python3link do PATH (tak jak robią to środowiska wirtualne), bez zmiany linków systemowych.

h4z3
źródło
bardzo pomocne dla nowych użytkowników Pythona.
Hassan Ajaz
0

Windows 10 WSL v1 (Ubuntu 16.04.6 LTS)

Ta odpowiedź reddit (lekko zmodyfikowana zadziałała dla mnie)

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

Leo Furze-Waddock
źródło
0

Żadna z odpowiedzi nie zadziałała dla mnie (używam Ubuntu 16.04 i Python 3.6). Więc ostatecznie rozwiązałem problem w następujący sposób:

1- Połącz się z FTP serwera

2- przejdź do folderu „/ usr / lib / python3 / dist-packages /”

3 - zduplikuj plik „apt_pkg.cpython-3 5 m-x86_64-linux-gnu.so”

4- zmień nazwę tego zduplikowanego pliku na „apt_pkg.cpython-3 6 m-x86_64-linux-gnu.so”

Otóż ​​to!

Julio S.
źródło
0

Jestem na Ubuntu 16.04 i zaktualizowałem do Pythona 3.7. Oto błąd, który miałem podczas próby dodania 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'

Udało mi się naprawić ten błąd, tworząc dowiązanie symboliczne z moim początkowym pythonem 3.4 apt_pkg.cpython-34m-x86_64-linux-gnu.so, tworząc następujące dowiązanie symboliczne

sudo ln -s apt_pkg.cpython-34m-x86_64-linux-gnu.so apt_pkg.so
GigaWatts
źródło
1
Wygląda na to, że to rozwiązanie zostało już zaproponowane w co najmniej 6 innych odpowiedziach na to pytanie (a 3 kolejne po prostu sugerowały skopiowanie pliku zamiast dowiązania symbolicznego).
Sergey Shubin,
to po prostu działa dla mnie, dzięki! Jedna rzecz jest taka, że ​​musimy cd / usr / lib / python3 / dist-packages
Hao Yellow
-3

Spróbuj to naprawić, ustawiając zmienne regionalne:

export LC_ALL="en_US.UTF-8"

export LC_CTYPE="en_US.UTF-8"
rajendra sharma
źródło
1
Postaraj się być bardziej szczegółowy i wyjaśnij, co robią te dwa polecenia.
dpapadopoulos
-5

Na wszelki wypadek, gdyby to pomogło innemu, w końcu rozwiązałem ten problem, który najwyraźniej był spowodowany konfliktami wersji Pythona, przekierowując link python3, a następnie przekierowując go do właściwej wersji Pythona:

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

Może być konieczne wprowadzenie poprawnej wersji Pythona, znalezionej za pomocą:

python3 -V
matthias2t
źródło
2
usuń python3 to zły pomysł :( jeśli chcesz link do pythona 3.4 użyj: ln -s /usr/bin/python3.4 / usr / bin / python3
Pamungkas Jayuda
1
Nigdy nie jest dobrym pomysłem mówienie ludziom, aby usunęli rzeczy z tego systemu, chyba że jest to naprawdę potrzebne. Na szczęście / usr / bin / python3 i tak jest zwykle tylko dowiązaniem symbolicznym. Naprawdę uważam, że powinieneś po prostu usunąć tę odpowiedź.
Jamie Lindsey