gỡ cài đặt python


786

Tôi đã cài đặt một gói python với python setup.py install.

Làm thế nào để tôi gỡ cài đặt nó?


52
Câu trả lời được chấp nhận đã lỗi thời. Sử dụng pip uninstall <your_package>. Xem stackoverflow.com/questions/1231688/ cấp .
Joachim W

21
gỡ cài đặt pip không phải là một câu trả lời hợp lệ nữa. Đây là bằng chứng. [sri @ localhost python] $ pip gỡ cài đặt foo KHAI THÁC: Gỡ cài đặt dự án cài đặt distutils (foo) đã không được chấp nhận và sẽ bị xóa trong phiên bản tương lai. Điều này là do thực tế là việc gỡ cài đặt một dự án distutils sẽ chỉ gỡ cài đặt một phần dự án.
shrewmouse 13/03/2015

@shrewmouse không hiển thị nữa.
JC Rocamonde

@JCRocamonde Với gói tôi đã tạo, phiên bản mới nhất của pip hiển thị It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.nên đây vẫn là một vấn đề.
Josh

@Josh ở đầu tệp setup.py của bạn làm "từ thiết lập nhập thiết lập" thay vì "từ thiết lập nhập distutils.core".
bigjake

Câu trả lời:


976

Lưu ý: Tránh sử python setup.py installdụngpip install .

Bạn cần xóa tất cả các tệp theo cách thủ công và cũng hoàn tác mọi nội dung khác mà cài đặt đã thực hiện thủ công.

Nếu bạn không biết danh sách tất cả các tệp, bạn có thể cài đặt lại nó với --recordtùy chọn và xem danh sách này tạo ra.

Để ghi lại danh sách các tập tin đã cài đặt, bạn có thể sử dụng:

python setup.py install --record files.txt

Khi bạn muốn gỡ cài đặt, bạn có thể sử dụng xargs để xóa:

xargs rm -rf < files.txt

Hoặc nếu bạn đang chạy Windows, hãy sử dụng Powershell:

Get-Content files.txt | ForEach-Object {Remove-Item $_ -Recurse -Force}

Sau đó xóa cũng là thư mục chứa, ví dụ như /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/my_module-0.1.egg/trên macOS. Nó không có tệp, nhưng Python vẫn sẽ nhập một mô-đun trống:

>>> import my_module
>>> my_module.__file__
None

Sau khi xóa, Python hiển thị:

>>> import my_module
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'my_module'

6
Nếu điều này không hiệu quả, hãy thêm sudo như sau:cat files.txt | xargs sudo rm -rf
saroele

21
Điều này sẽ gây rối trên các tập tin với không gian. Xem câu trả lời của tôi dưới đây: stackoverflow.com/a/25209129/14456
Ian Kelling

1
Làm cách nào tôi có thể cài đặt lại gói Tôi có mã nguồn sử dụng setup.py từ gói đó?
ア レ ッ ク ス

5
Điều này cũng để lại các thư mục trống ở vị trí của họ.
Dilawar

3
Xin chào, tôi đã thử đề xuất của bạn, đối với một số tệp khi tôi thử cat files.txt | xargs rm -rf nó nói quyền bị từ chối, ngay cả trong chế độ sudo, ví dụ: / usr / local / bin / pydoc hoặc / usr / local / bin / idle Bất kỳ ý tưởng nào tại sao?

212

Đối với tôi, phần lớn hoạt động sau đây:

đã cài đặt pip, vd:

$ easy_install pip

Kiểm tra, gói cài đặt của bạn được đặt tên theo quan điểm pip như thế nào:

$ pip freeze

Điều này sẽ liệt kê tên của tất cả các gói, bạn đã cài đặt (và được phát hiện bởi pip). Tên có thể đôi khi dài, sau đó chỉ sử dụng tên của gói được hiển thị tại và sau #egg=. Trong hầu hết các trường hợp, bạn cũng có thể bỏ qua phần phiên bản (bất cứ điều gì sau ==hoặc -).

Sau đó gỡ cài đặt gói:

$ pip uninstall package.name.you.have.found

Nếu nó yêu cầu xác nhận về việc gỡ bỏ gói, thì bạn là người may mắn và nó sẽ bị xóa.

Pip sẽ phát hiện tất cả các gói, được cài đặt bởi pip. Nó cũng sẽ phát hiện hầu hết các gói được cài đặt qua easy_install hoặc setup.py, nhưng trong một số trường hợp hiếm có thể thất bại.

Đây là mẫu thực từ thử nghiệm cục bộ của tôi với gói có tên ttr.rdstmctrên MS Windows.

$ pip freeze |grep ttr
ttr.aws.s3==0.1.1dev
ttr.aws.utils.s3==0.3.0
ttr.utcutils==0.1.1dev

$ python setup.py develop
.....
.....
Finished processing dependencies for ttr.rdstmc==0.0.1dev

$ pip freeze |grep ttr
ttr.aws.s3==0.1.1dev
ttr.aws.utils.s3==0.3.0
-e hg+https://vlcinsky@bitbucket.org/vlcinsky/ttr.rdstmc@d61a9922920c508862602f7f39e496f7b99315f0#egg=ttr.rdstmc-dev
ttr.utcutils==0.1.1dev

$ pip uninstall ttr.rdstmc
Uninstalling ttr.rdstmc:
  c:\python27\lib\site-packages\ttr.rdstmc.egg-link
Proceed (y/n)? y
  Successfully uninstalled ttr.rdstmc

$ pip freeze |grep ttr
ttr.aws.s3==0.1.1dev
ttr.aws.utils.s3==0.3.0
ttr.utcutils==0.1.1dev

Chỉnh sửa 2015-05-20

Tất cả những gì được viết ở trên vẫn được áp dụng, dù sao, có những sửa đổi nhỏ hiện có.

Cài đặt pip trong python 2.7.9 và python 3.4

Các phiên bản python gần đây đi kèm với gói ensurepipcho phép cài đặt pip ngay cả khi ngoại tuyến:

$ python -m oblurepip - nâng cấp

Trên một số hệ thống (như Debian Jessie), điều này không khả dụng (để ngăn chặn việc cài đặt python hệ thống).

Sử dụng grephoặcfind

Ví dụ trên giả sử, bạn đã grepcài đặt. Tôi đã có (tại thời điểm tôi có MS Windows trên máy của mình) đã cài đặt bộ tiện ích linux (bao gồm grep). Ngoài ra, sử dụng MS Windows gốc findhoặc đơn giản bỏ qua việc lọc và tìm tên trong danh sách dài hơn các gói python được phát hiện.


1
bạn đang sử dụng công cụ / phiên bản đóng gói nào để làm việc này? ( distutils, distributev.v ...)
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功

1
Tôi sử dụng setuptools. Bạn có thể kiểm tra bitbucket.org/vlcinsky/ttr.aws.utils.s3 (không hoàn hảo). Dù sao, tôi khá không hài lòng với việc sử dụng các gói không gian tên, đôi khi việc nhập bị hỏng mà không có lý do rõ ràng. Nhưng đó là một câu chuyện khác.
Jan Vlcinsky

1
Sửa mình. Mặc dù tôi nhập khẩu setuptools, nhưng thực tế tôi sử dụng distribute. Một bài học khác: khi cài đặt gói riêng của tôi từ pypi và dự định phát triển một gói khác cục bộ chia sẻ cùng một không gian tên, không sử dụng $ pip install <the package> , sử dụng $ easy_install <the package>, nếu không bạn sẽ gặp xung đột khi nhập gói phát triển của mình.
Jan Vlcinsky

1
Để giúp đỡ người khác: vì tôi không root, tôi cài đặt mọi thứ trong nhà. Đây là những gì tôi đã làm easy_install --user --prefix=$HOME pip. Sau đó, tôi được thêm vào sau trong PATH của tôi: ln -s /home/tflutre/.local/bin/pip ~/bin, ln -s /home/tflutre/.local/bin/pip2.7 ~/binln -s /home/tflutre/.local/bin/pip2 ~/bin.
tflutre

3
Điều này nên được chấp nhận câu trả lời, vì nó dễ dàng hơn nhiều và pip thường đi kèm với Python. Nó là đơn giản để sử dụng trong dấu nhắc lệnh / thiết bị đầu cuối - pip uninstall modulehoặc python -m pip uninstall modulenên hoạt động. Cũng nên đa nền tảng, như là một phần của Python.
Edward

81

Câu trả lời số 1 có vấn đề:

  • Không làm việc trên mac.
  • Nếu một tệp được cài đặt bao gồm khoảng trắng hoặc các ký tự đặc biệt khác, xargslệnh sẽ thất bại và xóa mọi tệp / thư mục khớp với các từ riêng lẻ.
  • cái -rtrong rm -rflà không cần thiết và tệ nhất có thể xóa những thứ bạn không muốn.

Thay vào đó, đối với unix-like:

sudo python setup.py install --record files.txt
# inspect files.txt to make sure it looks ok. Then:
tr '\n' '\0' < files.txt | xargs -0 sudo rm -f --

Và cho các cửa sổ:

python setup.py bdist_wininst
dist/foo-1.0.win32.exe

Cũng có những vấn đề không thể giải quyết được với việc gỡ setup.pycài đặt cài đặt sẽ không làm phiền bạn trong trường hợp điển hình. Để có câu trả lời đầy đủ hơn, hãy xem trang wiki này:

https://ofswiki.org/wiki/Uninstalling_setup.py_install


3
Tại sao bạn không để lại một gợi ý dưới cái được nêu lên? Lưu ý rằng, "những vấn đề nghiêm trọng" là về các trường hợp góc.
lpapp

17
Tôi đã để lại một bình luận dưới một nâng cao. Nhận xét của tôi bị chôn vùi dưới một liên kết "tải thêm bình luận" mà rất ít người nhấp vào. Tôi cũng đã đưa ra câu trả lời của riêng mình bởi vì tôi có rất nhiều điều để nói, tức là. các liên kết trong câu trả lời của tôi. Ngoài ra, trường hợp góc sẽ không phải là thuật ngữ đầu tiên xuất hiện trong đầu tôi khi một tập tin có một khoảng trống trong đó.
Ian Kelling

Đối với những gì nó có giá trị, tôi nghĩ rằng điều này sẽ thất bại đối với tên tập tin có dòng mới :) Cho dù bất kỳ nhà bảo trì gói nào là xấu xa, tôi hy vọng tôi không bao giờ phát hiện ra.
Jack O'Connor

2
Trên OS X Mavericks, ít nhất, xargs không có tùy chọn -d. Tại sao? Bởi vì Apple yêu bạn. Dù sao, điều này có tác dụng tương tự như trên, và an toàn với không gian và như vậy. Đó là Bash cụ thể, mặc dù. Sau khi chạy cài đặt với --record vào files.txt:OIFS=$IFS; IFS=$'\n'; FILES=( $( cat files.txt ) ); IFS=$OIFS; sudo rm -rf "${FILES[@]}"
Joseph Sikorski

2
@IanKelling Nhúng các biến trong printfchuỗi định dạng của sẽ không thành công nếu chuỗi xảy ra có chứa eg %hoặc \ký tự. Luôn cung cấp một chuỗi định dạng: printf '%s\0' "$line"(cũng tránh tiếng vang). Mặc dù bạn có thể tránh vòng lặp thêm bằng cách chỉ sử dụngtr '\n' '\0' < files.txt | xargs -0 rm -f
geirha

39

Đầu tiên ghi lại các tập tin bạn đã cài đặt. Bạn có thể lặp lại lệnh này, ngay cả khi bạn đã chạy trước đó setup.py install:

python setup.py install --record files.txt

Khi bạn muốn gỡ cài đặt, bạn chỉ có thể:

sudo rm $(cat files.txt)

Điều này hoạt động vì lệnh rm lấy danh sách các tệp được phân tách bằng khoảng trắng để xóa và bản ghi cài đặt của bạn chỉ là một danh sách như vậy.


Có cách nào để kiểm tra không chỉ nếu đó là chương trình của tôi đã cài đặt nó mà còn nếu kể từ đó, không có ứng dụng nào khác sử dụng tài nguyên này? Ví dụ: tôi đã cài đặt một công cụ, để làm như vậy, tôi đã phải cài đặt một số thư viện, có thể một số trong số chúng đã được cài đặt (có nghĩa là tôi không thể xóa trong quá trình gỡ cài đặt) nhưng tôi cũng không thể xóa bất kỳ ứng dụng nào khác không được cài đặt vì thư viện của tôi đã được cài đặt trước ..
Gabrielle

19

Bây giờ python cung cấp cho bạn sự lựa chọn để cài đặt piptrong quá trình cài đặt (Tôi đang ở trên Windows và ít nhất python cũng làm như vậy cho Windows!). Xem xét bạn đã chọn cài đặt piptrong quá trình cài đặt python (bạn thực sự không phải chọn vì nó là mặc định), pipđã được cài đặt cho bạn. Sau đó, nhập vào pipdấu nhắc lệnh, bạn sẽ thấy một trợ giúp đi lên. Bạn có thể tìm thấy hướng dẫn sử dụng cần thiết ở đó. Ví dụ, pip listhiển thị cho bạn danh sách các gói được cài đặt. Bạn có thể dùng

pip uninstall package_name

để gỡ cài đặt bất kỳ gói nào bạn không muốn nữa. Đọc thêm ở đây (tài liệu pip) .


8

Cách lười biếng: chỉ cần gỡ cài đặt từ menu cài đặt Windows (nếu bạn đang sử dụng Windows) hoặc từ lệnh rpm, với điều kiện bạn phải cài đặt lại trước khi tạo gói phân phối.

Ví dụ,

python setup.py bdist_wininst
dist/foo-1.0.win32.exe

("foo" là một ví dụ của khóa học).


4
Tôi không biết nếu tôi thích nó, nhưng bạn có một điểm cho suy nghĩ trực giao. :)
Lennart Regebro

Thành thật mà nói, tôi cũng không chắc là "cách lười biếng" ;-) Nhưng tôi nghĩ tôi đã đề cập đến việc có thể tạo ra trình cài đặt "chuẩn" hơn. Thật lạ là setup.py không cung cấp một cách rõ ràng để loại bỏ các gói.
RedGlyph

1
Gỡ cài đặt yêu cầu đăng ký tập trung của các gói đã cài đặt và các tệp của nó, và không có. Các cuộc thảo luận đang diễn ra về cách cải thiện câu chuyện này và nó có thể được giải quyết trong Python 2.7 / 3.2 hoặc 2.8 / 3.3 hoặc hơn thế.
Lennart Regebro

1
@Lennart: ít nhất sẽ không có Python 2.8, đó là tuyên bố chính thức hiện tại
Piotr Owsiak

2
@PiotrOwsiak: Vâng, nhưng đó không phải là tuyên bố sau đó. 2.8 vẫn là một khả năng tại thời điểm đó và vẫn duy trì cho đến khi PEP 404 được phê duyệt, vào cuối năm ngoái, tôi nghĩ vậy.
Lennart Regebro

6

Chuyển đến thư mục gói python của bạn và xóa tệp .egg của bạn, ví dụ: Trong python 2.5 (ubfox): /usr/lib/python2.5/site-packages/

Trong python 2.6 (ubfox): /usr/local/lib/python2.6/dist-packages/


1
Hoạt động, trừ khi cài đặt các tệp đã cài đặt bên ngoài gói, một số thao tác, như setuptools cài đặt và lệnh easy_install.
Lennart Regebro

3
Thông thường, nếu một gói được cài đặt bằng python setup.py như được chỉ định bởi OP, sẽ không có trứng. OTOH, nếu có một vì easy_install đã được sử dụng, cách tài liệu để gỡ cài đặt các gói là sử dụng easy_install -m trước khi xóa tệp trứng; mặt khác, vỏ trứng có thể bị bỏ lại trong tệp easy-install.pth.
Ned Deily

5

Không trả lời chính xác câu hỏi, nhưng điều gì đó giúp tôi mỗi ngày:

Cài đặt gói của bạn với

pip install .

Điều này đặt gói trong $HOME/.local. Gỡ cài đặt với

pip uninstall <package_name>

1
pip unistall .không làm việc cho tôi, nhưng pip uninstall <package_name>đã làm, cảm ơn!
Danijel

4

Có lẽ bạn có thể làm điều này như là một thay thế: -

1) Nhận phiên bản python -

[linux machine]# python
Python 2.4.3 (#1, Jun 18 2012, 14:38:55) 

-> Lệnh trên cung cấp cho bạn Phiên bản python hiện tại là 2.4.3

2) Nhận thư mục cài đặt của python -

[linux machine]# whereis python
python: /usr/bin/python /usr/bin/python2.4 /usr/lib/python2.4 /usr/local/bin/python2.5 /usr/include/python2.4 /usr/share/man/man1/python.1.gz

-> Từ lệnh trên, bạn có thể nhận được thư mục cài đặt - /usr/lib/python2.4/site-packages

3) Từ đây bạn có thể loại bỏ các gói và tệp python egg

[linux machine]# cd /usr/lib/python2.4/site-packages
[linux machine]# rm -rf paramiko-1.12.0-py2.4.egg paramiko-1.7.7.1-py2.4.egg paramiko-1.9.0-py2.4.egg

Điều này làm việc cho tôi .. Và tôi đã có thể gỡ cài đặt gói gây phiền toái cho tôi :)


3

Tôi nghĩ rằng bạn có thể mở setup.py, xác định tên gói và sau đó yêu cầu pip gỡ cài đặt nó.

Giả sử tên có sẵn trong biến 'METADATA':

pip uninstall $(python -c "from setup import METADATA; print METADATA['name']")

1

Mở rộng những gì Martin nói, ghi lại đầu ra cài đặt và một chút kịch bản bash thực hiện thủ thuật khá độc đáo. Đây là những gì tôi làm ...

for i in $(less install.record);
sudo rm $i;
done;

Và uy tín. Gỡ cài đặt.


2
Dễ dàng hơn nhiều để viết này như sudo xargs rm -v < install.record.
poolie

1

Nếu bạn vẫn có các tệp được cho là sẽ bị xóa sau khi cài đặt lại gói, hãy đảm bảo thư mục buildcũng bị xóa. Do đó, giả sử đó pkglà gói bạn muốn xóa:

rm -r $(python3 -c "import pkg; print(pkg.__path__[0] + '*' )") 
rm -rf build

Trên công việc cho python3 và xóa gói và tệp * .egg-thông tin của nó


1

Tại {virtualenv}/lib/python2.7/site-packages/(nếu không sử dụng virtualenv thì {system_dir}/lib/python2.7/dist-packages/)

  • Xóa tệp trứng (ví dụ distribute-0.6.34-py2.7.egg)
  • Nếu có bất kỳ từ tập tin easy-install.pth, loại bỏ dòng tương ứng (nó phải là một đường dẫn đến thư mục nguồn hoặc của một tập tin trứng).

0

Tôi đã từng chạy "python setup.py install" vào một lúc nào đó trong quá khứ vô tình trong môi trường toàn cầu của tôi và gặp nhiều khó khăn khi gỡ cài đặt. Những giải pháp này không giúp được gì. "gỡ cài đặt pip" không hoạt động với "Không thể gỡ cài đặt 'splunk-appinspect'. Không tìm thấy tệp nào để gỡ cài đặt." "sudo pip Uninstall" không hoạt động "Không thể gỡ cài đặt yêu cầu splunk-appinspect, không được cài đặt". Tôi đã thử gỡ cài đặt pip, xóa bộ đệm pip, tìm kiếm ổ cứng cho gói, v.v ...

"Pip show" cuối cùng đã đưa tôi đến giải pháp, "Vị trí:" đang chỉ vào một thư mục và đổi tên thư mục đó khiến gói được xóa khỏi danh sách của pip. Tôi đã đổi tên thư mục trở lại và nó không xuất hiện lại trong danh sách của pip và bây giờ tôi có thể cài đặt lại gói của mình trong virtualenv.


0

Tôi đã chạy python setup.py installmột lần trong PyCharm của mình, nó cài đặt tất cả các gói vào môi trường cơ sở conda của tôi. Sau này khi tôi muốn xóa tất cả các gói này,pip uninstall không hoạt động. Tôi đã phải xóa chúng khỏi /anaconda3/lib/python3.7/site-packages theo cách thủ công :(

Vì vậy, tôi không thấy lý do tại sao họ sử dụng setup.py thay vì viết tệp tests.txt. Tệp yêu cầu có thể được sử dụng để cài đặt các gói trong môi trường ảo và sẽ không gây rối với các gói python hệ thống.


-1

Có thể tốt hơn để xóa các tệp liên quan bằng cách sử dụng bash để đọc các lệnh, như sau:

sudo python setup.py install --record files.txt
sudo bash -c "cat files.txt | xargs rm -rf"

Đây là một bản sao của một câu trả lời trước đó.
Karl Richter
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.