【问题标题】:pip installs packages in virtualenv and globally when called from bash script当从 bash 脚本调用时,pip 在 vi​​rtualenv 和全局安装包
【发布时间】:2019-06-18 08:54:42
【问题描述】:

我正在尝试激活 python 环境并在 bash 文件中使用 pip 安装一些包。在环境中安装成功但在我的mac上也全局安装,不明白为什么。

script.sh:

#!/bin/bash
source '<absolute path>/venv/bin/activate'
which pip
pip install psutil
pip list

输出:

$ ./script.sh
<absolute path>/venv/bin/pip
...
Package          Version  
---------------- ---------
pip              19.0.3   
psutil           5.6.3    
setuptools       41.0.1  
wheel            0.33.1   

但是,在另一个没有虚拟环境的终端中,它也会被安装:

$ which pip
/usr/local/opt/python/libexec/bin/pip
$ pip list
Package          Version  
---------------- ---------
pip              19.0.3   
psutil           5.6.3   
setuptools       41.0.1    
wheel            0.33.1   

如果我在终端中一一键入脚本中的命令,它会按预期工作。
我错过了什么?

编辑:
如果我运行 pip freeze | xargs pip uninstall -y(在 env 中或全局中),它将删除 virtualenv 和全局中的包。
如果我再次运行脚本并在“站点包”ls venv/lib/python3.7/site-packages 中列出内容,则安装的包不存在,所以我的“venv/bin/pip”以某种方式指向我的全局“站点包”?

编辑2: 我找到了一种重现行为的方法。
1.创建环境python -m venv venv_test
2.激活环境. venv_test/bin/activate
3.在script.sh中编辑source '&lt;absolute path&gt;/venv_test/bin/activate'
4.运行脚本./script.sh

为什么这会使 pip 全局安装?

如果我跳过 2. 它会按预期工作。

【问题讨论】:

    标签: python bash pip


    【解决方案1】:

    在 bash 脚本中运行它会在不同的 shell 中运行命令,然后返回到原来的 shell。运行 source &lt;path&gt;/bin/activate 在您当前的 shell 中运行它,因此它可以从命令行运行。您的 bash 脚本如下所示:

    #!/bin/bash
    source "<absolute path>/venv/bin/activate"
    which pip
    pip install psutil
    pip listenter code here
    

    如果您使用source script.sh 调用它,它将在您当前的shell 中运行它并且应该按预期工作。希望这可以帮助。这里还有一些其他的方法: https://stackoverflow.com/a/13122219/7473057

    virtualenvs 的示例方法:

    1. 创建环境python -m venv venv_testvirtualenv venv_test
    2. 激活环境:source ./venv_test/bin/activate(在命令行上)
    3. 运行脚本./script.sh,已删除source "&lt;absolute path&gt;/venv/bin/activate"

    或者,我认为你所追求的是一个子shell,在里面运行所有东西,这在上面的链接中。

    【讨论】:

    • 它应该仍然在没有source的虚拟环境中安装包吗?执行完脚本后就不需要环境了。
    • 可能是这样的? stackoverflow.com/a/50829922/7473057 你可以在子shell 中执行source "&lt;absolute path&gt;/venv/bin/activate" 吗?
    • 我用edit2更新了这个问题。你有什么想法吗?
    • 您正在激活它两次,不知道为什么需要。这是一种工作方法: 1. 创建环境 python -m venv venv_test 2. 激活环境:source ./venv_test/bin/activate (在命令行上) 3. 运行脚本 ./script.sh,其中有source "&lt;absolute path&gt;/venv/bin/activate"已删除。
    • 在我的系统上测试这个,我的系统 python /usr/bin/python 看不到我在那个环境中安装的任何包
    猜你喜欢
    • 1970-01-01
    • 2013-01-19
    • 2013-11-02
    • 1970-01-01
    • 1970-01-01
    • 2015-10-08
    • 1970-01-01
    • 1970-01-01
    • 2016-05-27
    相关资源
    最近更新 更多