[英]VirtualEnv with empty `pip freeze` using `--no-site-packages` — how to?
[英]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
pip --version
which python
pip install package_name
希望這個答案對你有幫助!
我的問題是pip
和python3
版本。 對於最新版本的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.