pip3 報錯:pip is being invoked by an old script wrapper.

這個問題的原因是不正確的安裝。pip的升級部分有的文章屬於 CSDN 博主的誤導,在這點上我也吃了虧,特別寫這一篇文章提醒大家。碰到問題多搜索,不要聽信一家之言。要不然很容易把自己的工作進度搞崩。

這類問題的issue在github上,鏈接地址:https://github.com/pypa/pip/issues/5599

開始分析

After upgrading to pip 10 or higher, many users are encountering error like

These are caused by an incorrect attempt to upgrade pip, which has typically resulted in (parts of) multiple versions of pip being installed in the same Python installation, and those parts being incompatible.

文中提到以上的錯誤原因是不正確的pip升級導致。這些升級使得在一個python中有了多種pip的版本從而導致不兼容。

我們繼續:

It should be noted that these issues are invariably not problems with pip itself, but are due to incorrect use of pip, or unexpected interactions with system scripts that are not controlled by pip. So while we’ll try to help you solve your issue, this is not the “fault” of pip, and you will have to be prepared to do at least some of the debugging and fixes on your own.

但是這些問題並不是出自pip它本身。而是使用不規範或不被pip控制的系統腳本的意外交互所致。所以我們幫你一起解決。

問題的建議

General Advice

First, some general advice. It is assumed that anyone encountering issues will have failed to follow some part of this advice. Listing these items here is not intended to imply that “it’s your fault and we won’t help”, but rather to help users to identify what went wrong, so that they can work out what to do next more easily.

  1. Only ever use your system package manager to upgrade the system pip. The system installed pip is owned by the distribution, and if you don’t use distribution-supplied tools to manage it, you will hit problems. Yes, we know pip says “you should upgrade with pip install -U pip” - that’s true in a pip-managed installation, ideally distributions should patch this message to give appropriate instructions in the system pip, but they don’t. We’re working with them on this, but it’s not going to happen soon (remember, we’re looking at cases where people are upgrading old versions of pip here, so patches to new versions won’t help).
  2. Never use sudo with pip. This follows on from the first point. If you think you need to use sudo, you’re probably trying to modify a distribution-owned file. See point 1.
  3. Prefer to use --user. By doing this, you only ever install packages in your personal directories, and so you avoid interfering with the system copy of pip. But there are PATH issues you need to be aware of here. We’ll cover these later. Put simply, it’s possible to follow this advice, and still hit problems, because you’re not actually running the wrapper you installed as --user.

首先,是建議:

第一條:

只用系統管理包去升級系統的pip

系統的包是發行版,不使用系統發行版提供的工具去管理就會發生問題。

第二條:

不要sudopip一起用,這會改變系統的pip發行版本

第三條:

積極使用--user,這樣就可以在個人目錄下安裝軟件包。

問題的調試

Debugging the Issue

Before trying to work out what’s going on, it’s critically important that you understand precisely what scripts you are running and what versions of pip the relevant Python interpreter is using.

First, identify the full absolute path of the executable script that you are running. That’s often in the traceback you get, but if it isn’t, you can use OS tools like which, or Python’s shutil.which to identify the right script. Watch out for your shell confusing the issue, with aliases or potentially stale hashed commands.

Once you have identified the script, make sure you can reproduce the problem using the absolute path to that script. If you can’t, you probably found the wrong script, so check again.

Second, work out which version of Python the script is using to run pip. You’ll often be able to get that from the shebang line of the script. This can often be the trickiest problem, as wrapper scripts can take many forms depending on what tool created them. In the worst case, you can simply make an intelligent guess at this point.

Once you know which Python is running pip, you can run python -m pip to invoke pip. In most cases, this will work fine, as it’s the wrapper causing the issue, and not pip itself. Running pip via python -m in this way is often a perfectly acceptable workaround for the issue (at least in the short term).

Now run python -m pip --version. This will give you the exact version and location of the installation of pip that your Python is seeing.

At this point, you’re usually done - the fundamental cause of all these problems is running a wrapper script which is written expecting to see a version of pip older than pip 10 (that’s why it imports pip.main) under a Python interpreter that sees a copy of pip that’s version 10 or later.

先要確定你使用的pythonpip的版本以及路徑。可以使用which等命令去定位出錯pip所在的腳本。

腳本確定後,再看看這種情況能否復現。再確定知道是哪個版本的python pip,這個信息一般可以在錯誤的提示找到。以上的問題全都確定後,可以使用python - m pip去調用pip,多數情況下是很有效的。在短期內使用python -m pip是解決這個問題的好辦法。

現在運行python -m pip可以看到python pip的安裝位置。

導致這個問題出現的原因是:運行了包裝器腳本,這個腳本是用來查看是否有比pip 10更老的pip包來判斷pip的新舊。

問題的解決

Fixing the Issue

The problem, of course, is fixing the issue. And that’s where you really are on your own. If you have changed your system installation, you really need to put it back the way that the distribution installed it. That may well require an uninstall and reinstall of your distribution’s pip package. Reinstalling is easy, of course - but uninstalling may require manually removing incorrect files. Or you may be able to force-reinstall with your distribution package manager, simply overwriting the incorrect files. Of course, this reverts you to the system-supplied version of pip. If you need a newer version, you should ask your distribution vendor, or use something like virtualenv to install it independently of your system packages.

It may be that you’re simply running the “wrong” wrapper script. Maybe you did a --user install of a new version of pip, but your PATH is set to run the system version of the wrapper rather than the user-local one installed with pip. In that case, you can simply fix your PATH. That’s usually the issue for people who do pip install --user --upgrade pip and get the pip.main error.

As already noted, python -m pip is a reliable workaround, at the cost of using a more verbose command to invoke pip.

最後我們來解決問題:

如果是你自己改了系統的pip包。你需要把系統的pip包還原。如果實在需要升級,使用虛擬環境virtualenv等進行安裝。

如果是使用的系統原裝的pip運行了腳本.儘管安裝了新的pop,但是沒有使用新的pip運行。那就可能是你的PATH設置不正確,修復PATH即可。這一情況通常是因爲使用pip install --user --upgrade pip,並得到了pip.main錯誤

最後,python -m pip是一種可靠的辦法,但是是以加了-m爲代價的。

個人建議:

可以使用:

python3 -m pip uninstall pip setuptools wheel
sudo apt-get --reinstall install  python3-setuptools python3-wheel python3-pip

試試修復回系統版本

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章