使用venv时环境$ PATH不同

时间:2014-01-31 17:38:36

标签: python macos virtualenv pycharm

我在mac(OSX mavericks)上使用PyCharm来运行如下所示的简单脚本。它只是打印PATH变量。我在项目目录中有一个virtualenv。我在PyCharm中添加了一个Run Configuration,并尝试使用不同的Pythons:

# file mytest.py
import os
print "PATH: ", os.environ['PATH']

当我使用系统默认的python(/ usr / bin / python)运行时,它会为PATH打印正确的值(即我在.bash_profile文件中配置的PATH),它有点长且包含许多目录

但是当我选择venv的Python时,路径只会减少为:/usr/bin:/bin:/usr/sbin:/sbin:/Users/myname/projects/myproj/venv/bin

如果我从终端窗口运行脚本,则不会发生这种情况。在这种情况下,它显示系统的python和venv python的正确PATH。如果我停用venv并运行venv/bin/python mytest.py,也不会发生这种情况。

任何人都知道如何在从PyCharm运行并使用venv时设置正确的PATH值?

4 个答案:

答案 0 :(得分:16)

您应该知道所有环境变量都是继承的。 在.bash_profile中定义环境变量时,它在您的终端(bash)中可用, 以及将从终端启动的所有进程(这些进程将是bash进程的子进程)。 这就是您在终端内运行脚本时获得预期值的原因。

您不是从终端启动PyCharm,因此它不会继承PATH。 Python或venv也是如此(他们是从PyCharm发起的)。

要解决您的问题,您可以在此处选择3个选项:从终端启动PyCharm或将PATH变量定义从.bash_profile移动到会话初始化脚本(PATH将在系统范围内定义)或在PyCharm的运行配置中复制PATH(它具有那边有这样的选择)

祝你好运!

答案 1 :(得分:1)

我为SublimeLint构建了一些东西,用Python来表示你的shell的PATH。

https://github.com/lunixbochs/sublimelint/blob/st3/lint/util.py#L57

基本上,它运行$SHELL --login,回显你的路径并解析它。

要点是:

import os
import subprocess

shell = os.path.basename(os.environ['SHELL'])
output = subprocess.Popen(
    (shell, '--login', '-c', 'echo __SEP__$PATH'),
    stdout=subprocess.PIPE).communicate()[0] or ''
print output.split('__SEP__', 1)[1].split(':')

答案 2 :(得分:0)

我在Windows上的问题与案例有关:它是PathPATH之间的区别。

如果您选择:

  • 编辑配置
    • 环境变量
      • 显示(在右下角)

这显示了环境变量。在我的系统上,没有PATH,只有Path

定义新的PATH环境变量不起作用,但Path工作正常。

答案 3 :(得分:0)

在我的案例中有一个解决方法。

要修改环境变量PATH,我通常只需要在运行配置的环境变量设置中为PYTHONPATH变量添加额外的路径。 然后将PYTHONPATH添加到PATH。