Virtualenv 没有指向正确 python3
Virtualenv does not point to correct python3
我用 bash 脚本为我的项目创建了一个虚拟环境,bash 脚本保存在与项目相同的目录中:
#!/bin/bash
virtualenv=~/Library/Python/3.7/lib/python/site-packages/virtualenv.py
wd=$(dirname "$BASH_SOURCE")
env_dir=~/virtual_environments/invest_scripts
$virtualenv $env_dir
cd -- "$(dirname "$BASH_SOURCE")"
source $env_dir/bin/activate
sudo python3 setup.py develop
deactivate
在 运行 脚本之后,我使用
激活环境
source ~/virtual_environments/invest_scripts/bin/activate
但我得到以下输出
(invest_scripts) $which python
(invest_scripts) $/Users/name/virtual_environments/invest_scripts/bin/python
(invest_scripts) $which python3
(invest_scripts) $/usr/bin/python3
另外我发现当我打开交互python3
shell时虚拟环境没有激活,并且导入了一个在setup.py
中指定的包。该文件指向我的项目中显示的鸡蛋。
$ python3
Python 3.7.3 (default, Nov 15 2019, 04:04:52)
[Clang 11.0.0 (clang-1100.0.33.16)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy
>>> numpy.__file__
'/Users/name/invest_scripts/.eggs/numpy-1.18.0-py3.7-macosx-10.7 x86_64.egg/numpy/__init__.py'
有人可以解释发生了什么吗?
sudo
使用新的 shell 执行命令,它不会跨 PATH
环境变量进行复制。这不是 virtualenv
s 特有的问题。有关此问题的通用解决方案,请参阅 https://unix.stackexchange.com/questions/83191/how-to-make-sudo-preserve-path。
但是,您不需要依赖 shell 可执行文件解析。激活 virtualenv 本质上只是设置您的 PATH
变量,以便您的 shell 在您使用不合格的 python
可执行文件时首先找到 $env_dir/bin/python
。您可以只使用 $env_dir/bin/python
可执行文件的完整路径,从而完全避开可执行文件查找:
sudo $env_dir/bin/python setup.py install
但是,您通常希望在将软件包安装到 virtualenv 时避免切换用户,尤其是 root。应该没有必要。如果您在 virtualenv 中遇到权限问题 ,那么您过去曾使用过 sudo
,并且您不想使该问题复杂化。在这种情况下,通过递归地将文件重新分配给您自己的帐户来修复您的 virtualenv 权限:sudo chown -R $UID:`id -g` $env_dir
.
接下来,不要使用 setup.py install
,而是使用 pip
进行安装。只需在 virtualenv 中使用 pip
命令将其指向包含 setup.py
文件的目录。如果这是当前目录,请使用:
$env_dir/bin/pip .
我用 bash 脚本为我的项目创建了一个虚拟环境,bash 脚本保存在与项目相同的目录中:
#!/bin/bash
virtualenv=~/Library/Python/3.7/lib/python/site-packages/virtualenv.py
wd=$(dirname "$BASH_SOURCE")
env_dir=~/virtual_environments/invest_scripts
$virtualenv $env_dir
cd -- "$(dirname "$BASH_SOURCE")"
source $env_dir/bin/activate
sudo python3 setup.py develop
deactivate
在 运行 脚本之后,我使用
激活环境source ~/virtual_environments/invest_scripts/bin/activate
但我得到以下输出
(invest_scripts) $which python
(invest_scripts) $/Users/name/virtual_environments/invest_scripts/bin/python
(invest_scripts) $which python3
(invest_scripts) $/usr/bin/python3
另外我发现当我打开交互python3
shell时虚拟环境没有激活,并且导入了一个在setup.py
中指定的包。该文件指向我的项目中显示的鸡蛋。
$ python3
Python 3.7.3 (default, Nov 15 2019, 04:04:52)
[Clang 11.0.0 (clang-1100.0.33.16)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy
>>> numpy.__file__
'/Users/name/invest_scripts/.eggs/numpy-1.18.0-py3.7-macosx-10.7 x86_64.egg/numpy/__init__.py'
有人可以解释发生了什么吗?
sudo
使用新的 shell 执行命令,它不会跨 PATH
环境变量进行复制。这不是 virtualenv
s 特有的问题。有关此问题的通用解决方案,请参阅 https://unix.stackexchange.com/questions/83191/how-to-make-sudo-preserve-path。
但是,您不需要依赖 shell 可执行文件解析。激活 virtualenv 本质上只是设置您的 PATH
变量,以便您的 shell 在您使用不合格的 python
可执行文件时首先找到 $env_dir/bin/python
。您可以只使用 $env_dir/bin/python
可执行文件的完整路径,从而完全避开可执行文件查找:
sudo $env_dir/bin/python setup.py install
但是,您通常希望在将软件包安装到 virtualenv 时避免切换用户,尤其是 root。应该没有必要。如果您在 virtualenv 中遇到权限问题 ,那么您过去曾使用过 sudo
,并且您不想使该问题复杂化。在这种情况下,通过递归地将文件重新分配给您自己的帐户来修复您的 virtualenv 权限:sudo chown -R $UID:`id -g` $env_dir
.
接下来,不要使用 setup.py install
,而是使用 pip
进行安装。只需在 virtualenv 中使用 pip
命令将其指向包含 setup.py
文件的目录。如果这是当前目录,请使用:
$env_dir/bin/pip .