簡體   English   中英

virtualenv --no-site-packages 和 pip 仍在尋找全局包?

[英]virtualenv --no-site-packages and pip still finding global packages?

我的印象是virtualenv --no-site-packages會創建一個完全獨立和隔離的 Python 環境,但它似乎沒有。

例如,我在全局安裝了 python-django,但希望創建一個具有不同 Django 版本的 virtualenv。

$ virtualenv --no-site-packages foo       
New python executable in foo/bin/python
Installing setuptools............done.
$ pip -E foo install Django
Requirement already satisfied: Django in /usr/share/pyshared
Installing collected packages: Django
Successfully installed Django

據我所知,上面的pip -E foo install應該會重新安裝 Django 的新版本。此外,如果我告訴 pip 凍結環境,我會得到很多包。 我希望對於帶有--no-site-packages的新環境,這將是空白的?

$ pip -E foo freeze
4Suite-XML==1.0.2
BeautifulSoup==3.1.0.1
Brlapi==0.5.3
BzrTools==1.17.0
Django==1.1
... and so on ...

我是否誤解了--no-site-packages應該如何工作?

我遇到了這樣的問題,直到我意識到(早在我發現 virtualenv 之前),我已經將目錄添加到我的 .bashrc 文件中的 PYTHONPATH 中。 因為已經過去一年多了,所以我沒有馬上想到這一點。

您必須確保在您創建的虛擬環境中運行pip二進制文件,而不是在全局環境中運行。

env/bin/pip freeze

看一個測試:

我們使用--no-site-packages選項創建 virtualenv:

$ virtualenv --no-site-packages -p /usr/local/bin/python mytest
Running virtualenv with interpreter /usr/local/bin/python
New python executable in mytest/bin/python
Installing setuptools, pip, wheel...done.

我們從新創建的pip檢查freeze的輸出:

$ mytest/bin/pip freeze
argparse==1.3.0
wheel==0.24.0

但是如果我們確實使用全局pip ,這就是我們得到的:

$ pip freeze
...
pyxdg==0.25
...
range==1.0.0
...
virtualenv==13.1.2

也就是整個系統中pip已經安裝的所有包。 通過檢查我們得到(至少在我的情況下) which pip類似/usr/local/bin/pip的東西,這意味着當我們執行pip freeze時,它​​調用的是這個二進制文件而不是mytest/bin/pip

最終我發現,無論出於何種原因, pip -E 都不起作用。 但是,如果我真的激活了virtualenv,並使用virtualenv提供的easy_install來安裝pip,然后直接從內部使用pip,它似乎可以按預期工作並且只顯示virtualenv中的包

使用以下命令暫時清除PYTHONPATH

export PYTHONPATH=

然后創建並激活虛擬環境:

virtualenv foo
. foo/bin/activate

只有這樣:

pip freeze

我知道這是一個非常古老的問題,但對於那些來到這里尋找解決方案的人來說:

在運行pip freeze之前不要忘記激活 virtualenv ( source bin/activate )。 否則,您將獲得所有全局包的列表。

顧名思義, --no-site-packages應該從sys.path中刪除標准的 site-packages 目錄。 任何其他存在於標准 Python 路徑中的東西都將保留在那里。

如果您直接將腳本調用為script.py ,則在 Windows 上可能會出現類似的問題,然后使用 Windows 默認打開器並在虛擬環境之外打開 Python。 使用python script.py調用它會在虛擬環境中使用 Python。

當您將 virtualenv 目錄移動到另一個目錄(在 linux 上)或重命名父目錄時,這似乎也會發生。

我遇到了同樣的問題。 我(在 Ubuntu 上)的問題是我的路徑名包含$ 當我在 $ 目錄之外創建一個 virtualenv 時,它運行良好。

詭異的。

virtualenv pip 不起作用的可能原因之一是,如果任何父文件夾的名稱/Documents/project name/app中有空格,將其重命名為/Documents/projectName/app可以解決問題。

這是所有 pip 安裝選項的列表 - 我沒有找到任何 ' -E ' 選項,可能是舊版本有它。 下面我為即將到來的 SO 用戶分享一個簡單的英語用法和virtualenv的工作。


一切似乎都很好,接受激活virtualenv ( foo )。 它所做的只是允許我們擁有多個(和不同的)python 環境,即各種 Python 版本,或各種 Django 版本,或任何其他 Python 包 - 以防我們在生產中有以前的版本並想用我們的測試最新的 Django 版本應用。

簡而言之,創建和使用(激活)虛擬環境( virtualenv )可以使用不同的 Python 解釋器(即 Python 2.7 和 3.3)運行或測試我們的應用程序或簡單的 Python 腳本 - 可以是全新安裝(使用--no-site-packages選項)或現有/上次設置中的所有軟件包(使用--system-site-packages選項)。 要使用它,我們必須激活它:

$ pip install django會將其安裝到全局站點包中,同樣獲得pip freeze將給出全局站點包的名稱。

而在 venv dir (foo) 中執行$ source /bin/activate將激活 venv 即現在用 pip 安裝的任何東西都只會安裝在虛擬環境中,只有現在 pip freeze 不會給出全局站點包列表 python包。 激活后:

$ virtualenv --no-site-packages foo       
New python executable in foo/bin/python
Installing setuptools............done.
$ cd foo
$ source bin/activate 
(foo)$ pip install django

(foo)$符號之前表示我們正在使用虛擬 Python 環境,即任何帶有 pip 的東西 - 安裝、凍結、卸載都將僅限於此 venv,並且對全局/默認 Python 安裝/包沒有影響。

我遇到了同樣的問題,venv 中的 pip 仍然可以作為全局 pip。
在搜索了很多頁面后,我以這種方式弄清楚了。
1. 通過 virtualenv 使用選項“--no-site-packages”創建一個新的 venv

virtualenv --no-site-packages --python=/xx/xx/bin/python my_env_nmae

請注意,雖然“--no-site-packages”選項自 1.7.0 起在 virtualenv 的 doc 文件中默認為 true,但我發現它不起作用,除非您手動設置它。 為了得到一個純 venv,我強烈建議打開這個選項 2. 激活你創建的新 env

source ./my_env_name/bin/activate
  1. 檢查您的 pip 位置和 python 位置,並確保這兩個命令在虛擬環境下
pip --version
which python
  1. 在 virtual env 下使用 pip 來安裝不受全局包中斷的包
pip install package_name

希望這個答案對你有幫助!

我的問題是pippython3版本。 對於最新版本的django安裝, pip3是必需的。 因此,在使用以下命令創建虛擬環境后,我的問題得到了解決:

> virtualenv --python=python3 venv
> source venv/bin/activate
> which pip3 #should be different from /usr/local/bin/pip3
...<some-directory>/venv/bin/pip3

PS出現這個問題是因為我在ubuntu中的python默認版本是2.7。 通過使用上述命令,它將忽略默認版本。

對於任何更新到 ubuntu 22.04 或被相同問題混淆的人,首先刪除已安裝的 pip,根據 python.org 中的文檔將 pip 重新安裝到 /usr/local/bin,到時間是 3.10.5,運行:

sudo python get-pip.py --prefix=/usr/

如果你沒有腳本,你需要下載腳本。返回成功消息后,安裝virtualenv或詩歌,它會注意到/usr/local不可寫,並安裝到~/.local/what/ever,沒事。 然后一切順利,使用 virtualenv 在項目目錄中重新創建 venv 文件夾。 如果發生任何奇怪的事情,請使用 which 命令檢查 pip3 或 virtualenv 的路徑,並將其刪除。

我的問題是我已經安裝了虛擬環境如下

python3 -m venv venv

然后在激活 venv 之后,我正在運行

python3 main.py

它只依賴於全局包,因為它沒有提示我安裝包。

運行下面的技巧

python main.py

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM