如何在Python Shell中激活虚拟环境

4

我已经创建了一个虚拟环境(文件夹名为env),并安装了一些第三方包。我使用的是Mac OSX操作系统。如何在Python交互式shell激活我的venv?我尝试过:

source env/bin/activate

当运行代码时,出现错误消息:SyntaxError: invalid syntax

我看到有人在8年前发布过这个问题,但我没有找到我要找的内容... 我也查看了Python文档,但对我如何激活它不清楚。

https://docs.python.org/3/tutorial/venv.html?highlight=virtual

有人能帮忙吗?


请提供您所遇到的完整错误信息。 - Slam
2
你不需要在Python shell中激活虚拟环境,而是在打开Python shell之前就要激活。换句话说,你需要在你的系统shell中运行该命令。 - malberts
我看错了问题:)抱歉,在您使用的“SHELL”中执行source /path/to/activate,而不是在交互式的python解释器中执行:)。 source是一个shell(bash、ksh等)内置函数:),而不是与python相关的东西。 - han solo
谢谢 @ han solo:那么,当我习惯使用IDLE时,正确的步骤是什么?首先在系统终端中激活环境...然后呢? - aurumpurum
1
当你激活一个虚拟环境时,你正在改变shell运行的python可执行文件。因此,你不能在python正在运行时激活虚拟环境,因为你已经选择了一个特定的解释器。 - C.Nivs
显示剩余2条评论
1个回答

2
在你的shell中,通常python会指向默认的Python实例:最初的回答
python

Python 2.7.14 (default, Sep 25 2017, 09:53:22)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.37)] on darwin
Type "help", "copyright", "credits" or "license" for more information.

这是因为python位于默认PATH的一部分/usr/local/bin。现在,当你source activate <some_env>时,你正在修改PATH,你可以在/path/to/venv/some_env/bin/activate文件中看到这一点。"Original Answer"翻译成"最初的回答"。
#!/bin/bash

...

    if [[ $PATH == *"CONDA_PATH_PLACEHOLDER"* ]]; then
        # If it did, replace it with our _NEW_PART
        export PATH="$($_CONDA_PYTHON -c "import re; print(re.sub(r'CONDA_PATH_PLACEHOLDER', r'$_NEW_PART', '$PATH', 1))")"
    else

        #### HERE IS WHERE THAT PATH IS OVERWRITTEN

        export PATH="$_NEW_PART:$PATH"
    fi

    # CONDA_DEFAULT_ENV is the shortest representation of how conda recognizes your env.
    #    It can be an env name, or a full path.
    #    Last date of change: 2016-06-21
    # If the string contains / it's a path
    if [[ "$@" == */* ]]; then
        export CONDA_DEFAULT_ENV=$(get_abs_filename "$args")
    else
        export CONDA_DEFAULT_ENV="$args"
    fi
...
esac

我正在使用Anaconda,但概念是相同的,...表示我已经删掉了脚本的某些部分。它有效地将venv python可执行文件路径导出到PATH中。因此,除非满足以下两个条件之一,否则不会指向venv python:a)您明确调用该python可执行文件或b)您source activate myenv然后再调用python

因此,正确的工作流程是:

source /path/to/myenv/bin/activate myenv

然后调用python

例如,第一个对$PATH的调用是在激活我的conda env之前,第二个是在激活之后:

➜  ~ echo $PATH
/Users/mm92400/bin:/usr/local/bin:/Users/mm92400/anaconda3/bin:/Users/mm92400/.cargo/bin:/Library/Frameworks/Python.framework/Versions/3.6/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/TeX/texbin:/usr/local/share/dotnet:~/.dotnet/tools:/Library/Frameworks/Mono.framework/Versions/Current/Commands
➜  ~ source activate py36
(py36) ➜  ~ echo $PATH
/Users/mm92400/anaconda3/envs/py36/bin:/Users/mm92400/bin:/usr/local/bin:/Users/mm92400/anaconda3/bin:/Users/mm92400/.cargo/bin:/Library/Frameworks/Python.framework/Versions/3.6/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/TeX/texbin:/usr/local/share/dotnet:~/.dotnet/tools:/Library/Frameworks/Mono.framework/Versions/Current/Commands

note how $PATH is different


很好。所以你需要输入 source ~/env/bin/activate~ 代表的是 HOME,在你的情况下应该是 /Users/Andrea - C.Nivs
@ C.Nivs:谢谢。我可以激活我的虚拟环境并从终端打开IDLE。问题是,当我在IDLE中从我的虚拟环境运行程序时,我会在终端中收到以下消息:objc [14076]:Class FIFinderSyncExtensionHost在/System/Library/PrivateFrameworks/FinderKit.framework/Versions/AFinderKit (0x7fffa9866210)和/System/Library PrivateFrameworks/FileProvider.framework/OverrideBundles/FinderSyncCollaborationFileProviderOverride (0x10fd32dc8)中都有实现。其中之一将被使用。哪一个未定义。 - aurumpurum
这听起来像是一个新的SO问题。如果我猜的话,你的virtualenv 可能正在利用Mac附带的解释器。 - C.Nivs
@ C.Nivs:你所说的“利用”解释器是什么意思? - aurumpurum
@ C.Nivs:例如:1)我激活了我的虚拟环境 2)提示从(base)变为(env)(base)是正确的。3)然后我从终端打开idle:我只需输入idle,Idle窗口就会弹出。在Idle中,我打开了保存在虚拟环境文件夹中的文件。4)然后我运行以下代码:import requestsr = requests.get("http://google.com") print(r.content) - aurumpurum
显示剩余10条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接