Lỗi cài đặt python-dev: ImportError: Không có mô-đun nào có tên apt_pkg


95

Tôi là người dùng Debian và tôi muốn cài đặt python-dev, nhưng khi tôi chạy mã trong shell dưới dạng thư mục gốc:

# aptitude install python-dev

Tôi nhận được lỗi sau đây:

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

Có vẻ như vấn đề là gì và tôi có thể giải quyết nó như thế nào?


1
có vẻ như apt ist của bạn bị hỏng, điều gì sẽ xảy ra khi bạn thử apt-get install python-dev
Pierre Geier

Khi tôi thử với apt-get install python-dev, nó thông báo rằng nó đã được cài đặt: Đang đọc danh sách gói ... Xong Xây dựng cây phụ thuộc Đọc thông tin trạng thái ... Xong python-dev đã là phiên bản mới nhất. 0 được nâng cấp, 0 mới được cài đặt, 0 để xóa và 0 không được nâng cấp. Bất cứ một đề nghị nào khác?
Belphegor

Câu trả lời:


63

Đảm bảo rằng bạn có một gói python-apt đang hoạt động. Bạn có thể thử gỡ bỏ và cài đặt lại gói đó để khắc phục sự cố không định vị được apt_pkg.so.

apt-get install python-apt

Nó đã được cài đặt. Khi tôi nhấn: # apt-get install python-apt, nó cung cấp cho tôi Đang đọc danh sách gói ... Xong Xây dựng cây phụ thuộc Đọc thông tin trạng thái ... Xong python-apt đã là phiên bản mới nhất. 0 được nâng cấp, 0 mới được cài đặt, 0 để xóa và 0 không được nâng cấp. Và khi tôi thử lại với: # aptitude install python-dev Nó lại cho tôi lỗi tương tự. Một số ý kiến ​​khác tôi nên làm gì?
Belphegor

14
loại bỏ nó bằng cách sử apt-get remove --purge python-aptvà cài đặt nó một lần nữa
Arnestig

8
Hãy nhận biết các phụ thuộc khác. Tôi đã gỡ bỏ gói (quá) nhanh chóng trong Ubuntu và rất nhiều phụ thuộc khác cũng bị xóa (ví dụ: ubuntu-desktop). Tuy nhiên, đó là lỗi của tôi vì đã không chú ý đến các ghi chú trong nhật ký.
Al R.

1
Không thực sự chắc chắn có phải do python-apt hay không. Xem qua package.ubuntu.com/lucid/ubuntu-desktop để biết các phụ thuộc vào ubuntu-desktop.
Arnestig

2
@Arnestig BỎ QUA python-aptnghe khá nguy hiểm !! Đã học bài học của tôi một lần và tôi sẽ không thử nó.
alvas

141

Tôi đã gặp vấn đề này khi làm sudo apt-get update. Env của tôi là debian8, với python2.7 + 3.4 (mặc định) + 3.5.

Đoạn mã sau sẽ chỉ tạo lại apt_pkg....sotệp cho python 3.5

sudo apt-get install python3-apt --reinstall

Đoạn mã sau đã giải quyết được vấn đề của tôi,

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

Vì vậy, rõ ràng là python3-apt kiểm tra phiên bản python cao nhất, thay vì phiên bản python hiện tại đang được sử dụng.


28
sudo ln -s apt_pkg.cpython-{35m,34m}-x86_64-linux-gnu.sonên được đổi thành sudo ln -s apt_pkg.cpython-{35m,34m}-x86_64-linux-gnu.so apt_pkg.so
desaiankitb

39
Bạn thật tuyệt! Đối với tôi, đó là sudo ln -s apt_pkg.cpython-{35m,36m}-x86_64-linux-gnu.socho python3.6, và lỗi khủng khiếp này hiện đã biến mất.
Alex Gurrola

55
Sau khi cài đặt Python 3.7 bên cạnh 3.6 mặc định trong Ubuntu 18.04, sudo apt install python3.7tôi gặp lỗi apt_pkg này khi cố gắng chạy pip, vì vậy tôi cần phải chạy cd /usr/lib/python3/dist-packagessau sudo ln -s apt_pkg.cpython-{36m,37m}-x86_64-linux-gnu.sođó sudo apt install python3-pip.
abulka

3
đối với python 3.6, lệnh sẽ làsudo ln -s apt_pkg.cpython-{35m,36m}-x86_64-linux-gnu.so
StatguyUser

1
Các dấu ngoặc nhọn đó không phải là thuộc tính của lệnh ln. Họ gọi mở rộng dấu ngoặc nhọn
Carlos A. Ibarra

113

Giải quyết nó bằng cách này:

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

Hoặc là:

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

Về cơ bản, nếu bạn nhận được một No such file or directorychỉ lsđể cố gắng có được tên phù hợp.


Hoạt động hoàn hảo
Subhrajyoti Sen

3
Trên Ubuntu 18.04, hãy sử dụng $ cd / usr / lib / python3 / dist-pack $ sudo cp apt_pkg.cpython-36m-x86_64-linux-gnu.so apt_pkg.so
Naren Yellavula

Điều này cũng làm việc cho tôi ... Tôi đã liệt kê tất cả các tệp trên /usr/lib/python3/dist-packages, và tôi thấy rằng tôi không có apt_pkg.cpython-34m-i386-linux-gnu.sohoặc apt_pkg.cpython-3m-i386-linux-gnu.so, nhưng tôi có apt_pkg.cpython-36m-i386-linux-gnu.so... Tôi đã sao chép tệp này vào apt_pkg.sovà hoạt động hoàn hảo! Cảm ơn!
Leonardo Isso

Cái này cũng có tác dụng với tôi. Như @LeonardoIsso, tôi cũng liệt kê tất cả các tệp để tìm tên tệp thích hợp vì tôi đang sử dụng Linux 32 bit.
w3Develops

60

Điều này đã xảy ra với tôi trên Ubuntu 18.04.2 sau khi tôi cố gắng cài đặt Python3.7 từ repo deadsnakes.

Giải pháp là cái này

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

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


3
Chỉ muốn xác nhận với người khác rằng điều này thực sự hiệu quả với tôi.
AnthonyD973

2
thật điên rồ, cảm ơn bạn! Khi ở Docker: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
Đúng, đó là giải pháp :)
szedjani

1
đây là giải pháp! Sau khi nâng cấp lên python 3.7.
JOHN

1
18.04.04, nâng cấp lên python 3.7 và điều này cũng hiệu quả với tôi! Cảm ơn!!
RJaus

18

Lỗi này thường xảy ra khi phiên bản python mới hơn đã được cài đặt cùng với phiên bản cũ hơn, ví dụ;

  • Ubuntu 18.04.1 xuất xưởng với phiên bản python 3.6.6
  • Đã cài đặt ppa: deadsnakes / python3.7.1 hoặc thay thế
  • Chạy một lệnh sử dụng mô-đun apt_pkg và gặp lỗi như;

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

Khi chúng tôi cài đặt phiên bản python3 không phải distro với apt, nó sẽ đặt một thư mục mô-đun được chia sẻ thành thư mục của python3 thông thường nhất /usr/lib/python3.

Hầu hết thời gian điều này sẽ ổn, nhưng trong một số trường hợp, các phiên bản khác nhau của python dựa trên các thư viện hoặc đối tượng / thư viện được chia sẻ khác với phiên bản python khác, vì vậy, như các câu trả lời khác đã chỉ ra, chúng tôi cần liên kết .SO với phiên bản python chính xác. Vì vậy, nếu chúng ta đã cài đặt python3.6 trên hệ thống 64 bit thì liên kết apt_pkg .SO sẽ là

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

Nhưng vấn đề nằm ở chỗ, khi chúng ta cài đặt phiên bản python mới hơn thì liên kết sẽ cập nhật để trỏ về phiên bản python mới nhất dẫn đến lỗi không tìm thấy module apt_pkg. Bằng cách kiểm tra phiên bản python nào được gửi cùng với bản phân phối của bạn, bạn có thể tạo liên kết như hình trên. Hoặc chúng tôi sử dụng một phương pháp để cung cấp cho lệnh lựa chọn phiên bản python để liên kết .SO chẳng hạn như;

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

Vì python sẽ tạo liên kết này đến phiên bản python mới nhất được cài đặt nên chúng tôi cung cấp cho lệnh tùy chọn để chọn trong 3 phiên bản python, trong đó nó sẽ chọn phiên bản cao nhất được đưa ra.


2
Đang chạy 18.04.2, đề xuất đầu tiên của bạn đã phù hợp với tôi và cuối cùng tôi có thể chạy bản cập nhật sudo apt-get mà không có lỗi. Đề xuất thứ hai của bạn trả về lỗi nói rằng apt-get.so không phải là một thư mục.
Đóng cửa vào

15

Giải pháp của @ user8178061 hoạt động tốt nhưng tôi đã làm điều đó với một số sửa đổi cho phiên bản của mình python3.7với Ubuntu

Tôi đã thay thế apt_pkg.cpython-3m-i386-linux-gnu.sobằngapt_pkg.cpython-36m-x86_64-linux-gnu.so

Đây là hai lệnh để thực thi:

cd /usr/lib/python3/dist-packages

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


1
Điều này đã khắc phục sự cố của tôi. Điều này giải quyết vấn đề nếu nó là do chuyển phiên bản Python từ 3.6 sang 3.7.
JThistle

1
Cảm ơn, đã có cùng một vấn đề! Hãy xem xét sử dụng sudo ln -s apt_pkg.cpython-36m-x86_64-linux-gnu.so apt_pkg.sođể nó rõ ràng apt_pkg.solà gì .
Scipio

Đã hoạt động, nhưng tôi phải đổi nó thành sudo cp apt_pkg.cpython-37m-x86_64-linux-gnu.so apt_pkg.sovì một số lý do
Daniel

8

Điều này đã làm việc cho tôi sau khi cập nhật python3.7 trên ubuntu18.04

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

1
Điều này đã làm việc cho tôi sau khi nâng cấp python 3.8 trên ubuntu18.04.
Henry Palacios

6

Vì lý do nào đó, bản cài đặt của tôi bị thiếu apt_pkg.sotrong dir gói phân phối python3. ( apt_pkg.cpython-33m-x86_64-linux-gnu.sođã ở đó ?!) nhưng và tôi phải tạo một liên kết tượng trưng apt_pkg.so -> apt_pkg.cpython-33m-x86_64-linux-gnu.so trong/usr/lib/python3/dist-packages

Tôi không chắc liệu bản nâng cấp của mình có bị hỏng hay không hay tại sao lại như vậy. Nó xảy ra sau khi cố gắng nâng cấp (chính xác-> raring-> nâng cấp lượng tử)


Đây là sửa chữa chính xác cho tôi. Tôi đã gây ra sự cố này bằng cách sử dụng pip3 làm gốc, mặc dù tôi biết đó là một ý tưởng tồi. Tôi muốn xem mình sẽ bị sốc nặng như thế nào nếu tôi đặt ngón tay vào ổ cắm đèn. Câu trả lời là: khá tệ. Ngoài ra, việc gây rối với thiết lập / etc / Alternatives cũng không phải là điều dễ hiểu. Không dành cho bất kỳ ai là du khách bán thời gian. Tôi nghĩ rằng việc vượt qua liên kết python nào đã chỉ ra con trăn nào là vấn đề đã bắt đầu dẫn tôi đến thảm họa.
pauljohn32

6
  1. Kiểm tra phiên bản Python 3 mặc định của bạn:
python --version
Python 3.7.5
  1. cdvào /usr/lib/python3/dist-packagesvà kiểm tra các apt_pkg.*tệp. Bạn sẽ thấy rằng không có phiên bản Python mặc định của bạn:
ll apt_pkg.*
apt_pkg.cpython-36m-x86_64-linux-gnu.so
  1. Tạo liên kết biểu tượng:
sudo ln -s apt_pkg.cpython-36m-x86_64-linux-gnu.so apt_pkg.cpython-37m-x86_64- linux-gnu.so 

5

Phương án cuối cùng là 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 nếu lnlệnh quá nhiều đối với bạn hoặc bằng cách nào đó kỳ diệu không hoạt động.

cpở trên cũng có thể được mvnếu bạn chỉ dành riêng cho việc sử dụng một phiên bản Python.


4

nếu bạn đang sử dụng python 3.7, hãy hạ cấp nó xuống python 3.6 bằng cách cập nhật Giải pháp thay thế, Điều này phù hợp với tôi

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

sudo update-alternatives --config python3

Điều này làm việc cho tôi với python3.6 nhưng khi tôi trở lại python3.7, lỗi vẫn còn đó
Hugo Sohm

3

Nếu bạn đang sử dụng python 3.5, hãy hạ cấp xuống 3.4. Đó là động thái an toàn nhất để làm.

Dưới đây, /usr/lib/python3/dist-packagesbạn sẽ thấy *34m*python 3.5 không thể sử dụng. zhazha trả lời liên kết tượng trưng với nó.


làm thế nào để bạn hạ cấp nó?
Pynchia

tại sao hạ cấp là actin an toàn nhất?
David Medinets

3

Ngoài việc tạo một liên kết tượng trưng cho apt_pkg.so, bạn có thể muốn tạo apt_inst.sotheo cách tương tự của apt_pkg.so.

ln -s apt_inst.cpython-35m-x86_64-linux-gnu.so apt_inst.so 

1

Tôi thấy mọi người nói làm thế nào để khắc phục nó với việc sao chép kỳ lạ, vv, nhưng không ai thực sự nói tại sao sự cố xảy ra.

Vì vậy, hãy để tôi giải thích, đối với những người trong số các bạn, những người như tôi, không muốn làm rối tung các tệp hệ thống chỉ vì ai đó trên SO đã nói với họ như vậy.


Vấn đề là ở đó:

  • nhiều tập lệnh hệ thống có mã hóa cứng python3 shebang vào chúng. Bạn có thể tự mình kiểm tra:
~$ 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

  • Gói apt python python-apt/ python3-aptlà một gói hệ thống, vì vậy nó dành cho python hệ thống mặc định

Do đó, các tập lệnh sẽ luôn nhận được phiên bản hiện được liên kết đến python3, nhưng không thành công vì gói apt không có mặt.


Giải pháp chung: KHÔNG BAO GIỜ thay đổi python3liên kết mặc định . Không bao giờ. Điều này cũng áp dụng cho pythonliên kết - nếu một ứng dụng được viết bằng Python2 với một số phần tử cú pháp cũ không hoạt động trong Python3, thì ứng dụng đó sẽ không hoạt động.

[Thiết bị đầu cuối của tôi bị hỏng theo cách đó vì tôi sử dụng Terminator, có vẻ như được viết bằng Python2.7 không tương thích với Python3.]


Các giải pháp được trình bày ở đây đề xuất sao chép / liên kết các tệp gói apt hoặc thay đổi python3 liên kết.

Hãy phân tích cả hai:

  1. Sao chép / liên kết gói apt

Điều này không phải là vấn đề vì từ khoảng Python3.4, tất cả các tập lệnh python cũng hoạt động trên các phiên bản mới hơn.

Cho đến nay. Nhưng nó có thể bị hỏng trong tương lai - nếu bạn giữ hệ thống của mình đủ lâu.

  1. Thay đổi python3 liên kết trở lại

Đây là một giải pháp tuyệt vời vì chúng tôi có thể quay lại trạng thái "không bao giờ thay đổi liên kết"


"Nhưng tôi thích chỉ cần gõ python!" - Tôi thích nó quá! Đó là cách tôi giải quyết vấn đề này ngay từ đầu!

  1. Nói chung, bạn nên tránh thay đổi liên kết hệ thống theo cách thủ công - update-alternativesthay vào đó hãy sử dụng để liên kết các phiên bản khác nhau . Điều này áp dụng cho bất kỳ ứng dụng nào có nhiều phiên bản. Điều này vẫn sẽ phá vỡ các tập lệnh hệ thống đó (vì nó thay đổi liên kết), nhưng bạn có thể chuyển đổi qua lại dễ dàng mà không cần lo lắng liệu bạn có đặt liên kết và đích theo đúng thứ tự hay mắc lỗi đánh máy hay không.

  2. Cân nhắc sử dụng tên khác ngoài python/ python3cho liên kết hoặc bí danh của bạn.

  3. Hoặc thêm liên kết python/ của riêng bạn python3vào PATH (giống như môi trường ảo) mà không cần thay đổi liên kết hệ thống.


0

Windows 10 WSL v1 (Ubuntu 16.04.6 LTS)

Câu trả lời reddit này (sửa đổi một chút phù hợp với tôi)

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



0

Không có câu trả lời nào phù hợp với tôi (tôi đang sử dụng Ubuntu 16.04 và Python 3.6). Vì vậy, cuối cùng tôi đã giải quyết vấn đề như sau:

1- kết nối với FTP của máy chủ

2- chuyển đến thư mục "/ usr / lib / python3 / dist-pack /"

3- sao chép tệp "apt_pkg.cpython-3 5 m-x86_64-linux-gnu.so"

4- đổi tên tệp trùng lặp này thành "apt_pkg.cpython-3 6 m-x86_64-linux-gnu.so"

Đó là nó!


0

Tôi đang sử dụng Ubuntu 16.04 và đã nâng cấp lên Python 3.7. Đây là lỗi mà tôi đã gặp phải khi cố gắng thêm 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'

Tôi đã có thể sửa lỗi này bằng cách tạo liên kết tượng trưng với python 3.4 apt_pkg.cpython-34m-x86_64-linux-gnu.so bằng cách tạo liên kết tượng trưng sau

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

1
Có vẻ như giải pháp này đã được đề xuất trong ít nhất 6 câu trả lời khác cho câu hỏi này (và 3 câu trả lời khác chỉ được đề xuất sao chép tệp thay vì liên kết biểu tượng).
Sergey Shubin

điều này chỉ đơn giản làm việc cho tôi, cảm ơn! Có một điều là trước đó chúng ta cần cd / usr / lib / python3 / dist-pack
Hao Yellow

-3

Vui lòng cố gắng sửa lỗi này bằng cách đặt các biến ngôn ngữ:

export LC_ALL="en_US.UTF-8"

export LC_CTYPE="en_US.UTF-8"

1
Hãy cố gắng cụ thể hơn và giải thích hai lệnh này đang làm gì.
dpapadopoulos

-5

Chỉ trong trường hợp nó giúp ích cho người khác, cuối cùng tôi đã giải quyết được vấn đề này, rõ ràng là do xung đột phiên bản python, bằng cách chuyển hướng liên kết python3, sau đó chuyển hướng nó đến đúng phiên bản python:

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

Bạn có thể cần nhập đúng phiên bản python, được tìm thấy với:

python3 -V

2
loại bỏ python3 là một ý tưởng tồi :( nếu bạn muốn liên kết đến python 3.4, hãy sử dụng: ln -s /usr/bin/python3.4 / usr / bin / python3
Pamungkas Jayuda

1
Không bao giờ là một ý kiến ​​hay khi nói mọi người xóa mọi thứ khỏi hệ thống trừ khi nó thực sự cần thiết. May mắn thay / usr / bin / python3 thường chỉ là một liên kết tượng trưng. Tôi thực sự nghĩ rằng bạn chỉ nên xóa câu trả lời này.
Jamie Lindsey
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.