Kesalahan instalasi python-dev: ImportError: Tidak ada modul bernama apt_pkg

95

Saya adalah pengguna Debian, dan saya ingin menginstal python-dev, tetapi ketika saya menjalankan kode di shell sebagai root:

# aptitude install python-dev

Saya mendapatkan kesalahan berikut:

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

Apa yang tampaknya menjadi masalah dan bagaimana cara mengatasinya?

Belphegor
sumber
1
Sepertinya apt ist Anda rusak, apa yang terjadi ketika Anda mencoba apt-get install python-dev
Pierre Geier
Ketika saya mencoba dengan apt-get install python-dev dikatakan bahwa itu sudah terinstal: Membaca daftar paket ... Selesai Membangun pohon ketergantungan Membaca informasi status ... Selesai python-dev sudah versi terbaru. 0 ditingkatkan, 0 baru dipasang, 0 untuk menghapus dan 0 tidak ditingkatkan. Ada saran lain?
Belphegor

Jawaban:

63

Pastikan Anda memiliki paket python-apt yang berfungsi. Anda dapat mencoba dan menghapus dan menginstal paket itu lagi untuk memperbaiki masalah dengan apt_pkg.so tidak ditemukan.

apt-get install python-apt
Arnestig
sumber
Ini sudah terpasang. Ketika saya menekan: # apt-get install python-apt itu memberi saya Membaca daftar paket ... Selesai Membangun pohon ketergantungan Membaca informasi status ... Selesai python-apt sudah menjadi versi terbaru. 0 ditingkatkan, 0 baru dipasang, 0 untuk menghapus dan 0 tidak ditingkatkan. Dan ketika saya mencoba lagi dengan: # aptitude install python-dev Ini memberi saya kesalahan yang sama lagi. Beberapa ide lain apa yang harus saya lakukan?
Belphegor
14
hapus menggunakan apt-get remove --purge python-aptdan instal lagi
Arnestig
8
Waspadai dependensi lainnya. Saya menghapus paket (terlalu) dengan cepat di Ubuntu dan banyak dependensi lainnya juga dihapus (misalnya ubuntu-desktop). Ini adalah kesalahan saya karena tidak memperhatikan catatan di log.
Al R.
1
Tidak begitu yakin apakah itu karena python-apt. Lihat di packages.ubuntu.com/lucid/ubuntu-desktop untuk dependensi ke ubuntu-desktop.
Arnestig
2
@ArigmHAPUS python-aptterdengar agak berbahaya !! Mempelajari pelajaran saya sekali dan saya tidak akan mencobanya.
alva
141

Saya menemui masalah ini saat melakukannya sudo apt-get update. Env saya adalah debian8, dengan python2.7 + 3.4 (default) + 3.5.

Kode berikut hanya akan membuat ulang apt_pkg....sofile untuk python 3.5

sudo apt-get install python3-apt --reinstall

Kode berikut memecahkan masalah saya,

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

Jadi, jelas, python3-apt memeriksa versi python tertinggi, bukan versi python saat ini yang digunakan.

zhazha
sumber
28
sudo ln -s apt_pkg.cpython-{35m,34m}-x86_64-linux-gnu.soharus diubah menjadi sudo ln -s apt_pkg.cpython-{35m,34m}-x86_64-linux-gnu.so apt_pkg.so
desaiankitb
39
Kamu luar biasa! Bagi saya, itu sudo ln -s apt_pkg.cpython-{35m,36m}-x86_64-linux-gnu.sountuk python3.6, dan bug mengerikan ini sekarang hilang.
Alex Gurrola
55
Setelah menginstal Python 3,7 di sebelah default 3,6 di Ubuntu 18.04 dengan sudo apt install python3.7saya punya kesalahan apt_pkg ini mencoba menjalankan pip, jadi saya diperlukan untuk menjalankan cd /usr/lib/python3/dist-packageskemudian sudo ln -s apt_pkg.cpython-{36m,37m}-x86_64-linux-gnu.sokemudian sudo apt install python3-pip.
abulka
3
untuk python 3.6, perintahnya adalahsudo ln -s apt_pkg.cpython-{35m,36m}-x86_64-linux-gnu.so
StatguyUser
1
Tanda kurung tersebut bukan properti dari perintah ln. Mereka meminta ekspansi penyangga shell, lihat gnu.org/software/bash/manual/html_node/Brace-Expansion.html
Carlos A. Ibarra
113

Selesaikan dengan ini:

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

Atau:

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

Pada dasarnya, jika Anda No such file or directoryhanya lsmencoba untuk mendapatkan nama yang tepat.

pengguna8178061
sumber
Bekerja dengan sempurna
Subhrajyoti Sen
3
Di Ubuntu 18.04, gunakan $ cd / usr / lib / python3 / dist-packages $ sudo cp apt_pkg.cpython-36m-x86_64-linux-gnu.so apt_pkg.so
Naren Yellavula
Ini bekerja untuk saya juga ... Saya mendaftarkan semua file di /usr/lib/python3/dist-packages, dan saya melihat bahwa saya tidak memiliki apt_pkg.cpython-34m-i386-linux-gnu.soatau apt_pkg.cpython-3m-i386-linux-gnu.so, tetapi saya telah apt_pkg.cpython-36m-i386-linux-gnu.so... Saya menyalin file ini ke apt_pkg.sodan bekerja dengan sempurna! Terima kasih!
Leonardo Isso
Ini berhasil juga untuk saya. Seperti yang dilakukan @LeonardoIsso, saya juga mencantumkan semua file untuk menemukan nama file yang tepat karena saya menggunakan Linux 32 bit.
w3Mengembangkan
60

Ini terjadi pada saya di Ubuntu 18.04.2 setelah saya mencoba menginstal Python3.7 dari repo deadsnakes.

Solusinya adalah ini

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

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

Mirage Cermin
sumber
3
Hanya ingin memastikan kepada orang lain bahwa ini memang berhasil untuk saya.
AnthonyD973
2
itu gila, terima kasih! Saat di buruh pelabuhan: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
Ya, itulah solusinya :)
szedjani
1
inilah solusinya! Setelah meningkatkan ke python 3.7.
JOHN
1
18.04.04, meningkatkan ke python 3.7 dan ini juga berhasil untuk saya! Terima kasih!!
RJaus
18

Kesalahan ini akan sering terjadi ketika versi python yang lebih baru telah diinstal bersama dengan versi yang lebih lama misalnya;

  • Ubuntu 18.04.1 dikirimkan dengan python versi 3.6.6
  • Ppa yang diinstal: deadsnakes / python3.7.1 atau alternatif
  • Jalankan perintah yang menggunakan modul apt_pkg dan dapatkan kesalahan seperti;

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

Ketika kita menginstal versi python3 non-distro dengan apt itu akan mengatur direktori modul bersama menjadi python3 yang paling biasanya /usr/lib/python3.

Sebagian besar waktu ini akan baik-baik saja, tetapi dalam beberapa keadaan, versi python yang berbeda bergantung pada pustaka yang berbeda atau objek / pustaka bersama daripada versi python lainnya, jadi seperti yang ditunjukkan oleh jawaban lain, kami perlu menautkan .SO ke versi python yang benar. Jadi jika kita menginstal python3.6 pada sistem 64bit maka tautan apt_pkg .SO akan menjadi

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

Tetapi masalahnya terletak pada kenyataan bahwa ketika kita menginstal versi python yang lebih baru, tautan akan diperbarui untuk mengarah ke versi python terbaru, yang menyebabkan kesalahan modul apt_pkg tidak ditemukan. Dengan memeriksa versi python yang dikirimkan dengan distro Anda, Anda dapat membuat tautan seperti yang ditunjukkan di atas. Atau kami menggunakan metode untuk menawarkan perintah pilihan versi python untuk menghubungkan .SO seperti;

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

Karena python akan membuat tautan ini ke versi python yang terinstal terbaru, kami memberikan perintah opsi untuk memilih dari 3 versi python, yang akan memilih versi tertinggi yang diberikan.

Jamie Lindsey
sumber
2
Menjalankan 18.04.2, rekomendasi pertama Anda berhasil untuk saya dan saya akhirnya dapat menjalankan pembaruan sudo apt-get tanpa kesalahan. Rekomendasi kedua Anda mengembalikan kesalahan yang mengatakan apt-get.so bukan folder.
CloseISQ
15

Solusi @ user8178061 bekerja dengan baik tetapi saya melakukannya dengan beberapa modifikasi untuk versi saya python3.7dengan Ubuntu

Saya mengganti apt_pkg.cpython-3m-i386-linux-gnu.sodenganapt_pkg.cpython-36m-x86_64-linux-gnu.so

Di sini dua perintah untuk dieksekusi:

cd /usr/lib/python3/dist-packages

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

Hugo Sohm
sumber
1
Ini memperbaiki masalah saya. Ini menyelesaikan masalah jika itu disebabkan oleh pengalihan versi Python dari 3.6 ke 3.7.
JThistle
1
Terima kasih, punya masalah yang sama! Pertimbangkan untuk menggunakan sudo ln -s apt_pkg.cpython-36m-x86_64-linux-gnu.so apt_pkg.sosehingga jelas apa apt_pkg.soitu.
Scipio
Berhasil, tetapi saya harus mengubahnya menjadi sudo cp apt_pkg.cpython-37m-x86_64-linux-gnu.so apt_pkg.sokarena suatu alasan
Daniel
8

Ini berfungsi untuk saya setelah memperbarui python3.7 di ubuntu18.04

cd /usr/lib/python3/dist-packages
sudo cp apt_pkg.cpython-36m-x86_64-linux-gnu.so apt_pkg.so
astha
sumber
1
Ini berfungsi untuk saya setelah memutakhirkan python 3.8 di ubuntu18.04.
Henry Palacios
6

Untuk beberapa alasan instalasi saya hilang apt_pkg.sodi dir python3 dist-packages. ( apt_pkg.cpython-33m-x86_64-linux-gnu.soada di sana ?!) tapi dan saya harus membuat symlink apt_pkg.so -> apt_pkg.cpython-33m-x86_64-linux-gnu.so di/usr/lib/python3/dist-packages

Saya tidak yakin apakah peningkatan saya rusak atau mengapa hal ini terjadi. Itu terjadi setelah mencoba meningkatkan (presisi-> raring-> peningkatan kuantitatif)

Jamie Pate
sumber
Ini adalah perbaikan yang benar untuk saya. Saya menyebabkan masalah ini dengan menggunakan pip3 sebagai root, meskipun saya tahu itu adalah ide yang buruk. Saya ingin melihat seberapa parah saya akan terkejut jika saya memasukkan jari saya ke dalam soket lampu. Jawabannya adalah: sangat buruk. Juga mengotak-atik pengaturan / etc / alternatif bukan untuk tipuan hati. Tidak untuk siapa pun yang merupakan pengunjung paruh waktu. Saya pikir melintasi tautan python mana yang menunjuk pada python mana masalah yang memulai saya menuju bencana.
pauljohn32
6
  1. Periksa versi Python 3 default Anda:
python --version
Python 3.7.5
  1. cdke dalam /usr/lib/python3/dist-packagesdan periksa apt_pkg.*file. Anda akan menemukan bahwa tidak ada untuk versi Python default Anda:
ll apt_pkg.*
apt_pkg.cpython-36m-x86_64-linux-gnu.so
  1. Buat symlink:
sudo ln -s apt_pkg.cpython-36m-x86_64-linux-gnu.so apt_pkg.cpython-37m-x86_64- linux-gnu.so 
Nico Schlömer
sumber
5

Pilihan terakhir adalah 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 jika lnperintah terlalu banyak untuk Anda atau entah bagaimana secara ajaib tidak berfungsi.

cpdi atas juga bisa mvjika Anda hanya berdedikasi untuk menggunakan satu versi Python.

Tong Niu
sumber
4

jika Anda menggunakan python 3.7, turunkan ke python 3.6 dengan memperbarui Alternatif, Ini berhasil untuk saya

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

sudo update-alternatives --config python3
Viren Patel
sumber
Ini bekerja untuk saya dengan python3.6 tetapi ketika saya kembali ke python3.7, kesalahan masih ada
Hugo Sohm
3

Jika Anda menggunakan python 3.5, downgrade ke 3.4. Itu langkah teraman yang harus dilakukan.

Di bawah /usr/lib/python3/dist-packagesAnda akan melihat *34m*python 3.5 mana yang tidak dapat digunakan. zhazha menjawab symlink ke sana.

Pobe
sumber
bagaimana Anda menurunkannya?
Pynchia
mengapa downgrade adalah aktin teraman?
David Medinets
3

Selain membuat tautan simbolis apt_pkg.so, Anda mungkin ingin membuat apt_inst.sodengan cara yang sama apt_pkg.so.

ln -s apt_inst.cpython-35m-x86_64-linux-gnu.so apt_inst.so 
Taman Jihwan
sumber
1

Saya melihat semua orang mengatakan bagaimana memperbaikinya dengan penyalinan aneh dll, tetapi tidak ada yang benar-benar mengatakan mengapa masalah itu terjadi.

Jadi izinkan saya menjelaskan, bagi Anda yang menyukai saya tidak ingin mengacaukan file sistem hanya karena seseorang di SO yang memberi tahu mereka.


Masalahnya adalah:

  • banyak skrip sistem memiliki python3 shebang yang di-hardcode ke dalamnya. Anda dapat memeriksanya sendiri:
~$ 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-aptadalah paket sistem, jadi ini untuk sistem default python

Jadi, skrip akan selalu mendapatkan versi yang saat ini ditautkan python3, tetapi gagal karena paket apt tidak ada.


Solusi umum: JANGAN PERNAH mengubah python3tautan default . Pernah. Ini juga berlaku untuk pythontautan - jika aplikasi ditulis dengan Python2 dengan beberapa elemen sintaks lama yang tidak berfungsi di Python3, aplikasi tidak akan berfungsi.

[Terminal saya rusak seperti itu karena saya menggunakan Terminator, yang tampaknya ditulis dengan Python2.7 tidak kompatibel dengan Python3.]


Solusi yang disajikan di sini menyarankan untuk menyalin / menautkan file paket apt atau mengubah python3tautan.

Mari kita analisis keduanya:

  1. Menyalin / menautkan paket apt

Ini seharusnya tidak menjadi masalah karena dari sekitar Python3.4 semua skrip python juga berfungsi pada versi yang lebih baru.

Sejauh ini. Tetapi mungkin rusak di masa depan - jika Anda mempertahankan sistem Anda cukup lama.

  1. Mengubah python3link kembali

Ini adalah solusi yang bagus karena kita bisa kembali ke "jangan pernah mengubah tautan"


"Tapi aku suka mengetik saja python!" - Aku juga menyukainya! Begitulah cara saya mengatasi masalah ini sejak awal!

  1. Secara umum, Anda harus menghindari mengubah tautan sistem secara manual - gunakan update-alternativesuntuk menautkan versi yang berbeda . Ini berlaku untuk aplikasi apa pun dengan banyak versi. Ini masih akan merusak skrip sistem tersebut (karena memang mengubah tautan), tetapi Anda dapat beralih dengan mudah, tanpa khawatir apakah Anda meletakkan tautan dan tujuan dalam urutan yang benar atau salah ketik.

  2. Pertimbangkan untuk menggunakan nama lain selain python/ python3untuk tautan atau alias Anda.

  3. Atau tambahkan sendiri python/ python3tautan Anda ke PATH (seperti yang dilakukan lingkungan virtual), tanpa mengubah tautan sistem.

h4z3
sumber
0

Windows 10 WSL v1 (Ubuntu 16.04.6 LTS)

Jawaban reddit ini (sedikit diubah berfungsi untuk saya)

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

Leo Furze-Waddock
sumber
0

Tidak ada jawaban yang berhasil untuk saya (saya menggunakan Ubuntu 16.04 dan Python 3.6). Jadi saya akhirnya menyelesaikan masalah sebagai berikut:

1- terhubung ke FTP server

2- Buka folder "/ usr / lib / python3 / dist-packages /"

3- duplikat file "apt_pkg.cpython-3 5 m-x86_64-linux-gnu.so"

4- Ubah nama file duplikat ini menjadi "apt_pkg.cpython-3 6 m-x86_64-linux-gnu.so"

Itu dia!

Julio S.
sumber
0

Saya menggunakan Ubuntu 16.04, dan memutakhirkan ke Python 3.7. Berikut adalah kesalahan yang saya alami saat mencoba menambahkan 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'

Saya dapat memperbaiki kesalahan ini dengan membuat tautan simbolis dengan python awal 3.4 apt_pkg.cpython-34m-x86_64-linux-gnu.so dengan membuat tautan simbolis berikut

sudo ln -s apt_pkg.cpython-34m-x86_64-linux-gnu.so apt_pkg.so
GigaWatts
sumber
1
Sepertinya solusi ini sudah diusulkan dalam setidaknya 6 jawaban lain untuk pertanyaan ini (dan 3 lainnya hanya menyarankan untuk menyalin file daripada menyambungkan).
Sergey Shubin
ini bekerja untuk saya, terima kasih! Satu hal sebelumnya kita perlu cd / usr / lib / python3 / dist-packages
Hao Yellow
-3

Harap coba untuk memperbaikinya dengan menyetel variabel lokal:

export LC_ALL="en_US.UTF-8"

export LC_CTYPE="en_US.UTF-8"
rajendra sharma
sumber
1
Cobalah untuk lebih spesifik dan jelaskan apa yang dilakukan kedua perintah ini.
dpapadopoulos
-5

Untuk berjaga-jaga jika membantu yang lain, saya akhirnya menyelesaikan masalah ini, yang ternyata disebabkan oleh konflik versi python, dengan mengarahkan tautan python3, lalu mengarahkannya ke versi python yang benar:

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

Anda mungkin perlu memasukkan versi python yang benar, ditemukan dengan:

python3 -V
matthias2t
sumber
2
menghapus python3 adalah ide buruk :( jika Anda ingin menautkan ke python 3.4 gunakan: ln -s /usr/bin/python3.4 / usr / bin / python3
Pamungkas Jayuda
1
Tidak pernah merupakan ide yang baik untuk memberi tahu orang-orang untuk menghapus sesuatu dari sistem sana kecuali jika memang diperlukan. Untungnya / usr / bin / python3 biasanya hanya tautan simbolis. Saya benar-benar berpikir Anda harus menghapus jawaban ini.
Jamie Lindsey