gpt4 book ai didi

python - IPython 使用与 shell 不同的 $PATH 环境

转载 作者:太空狗 更新时间:2023-10-30 01:44:41 25 4
gpt4 key购买 nike

我在 IPython REPL 中调用 pip 时遇到了一些问题,一段时间后我注意到 IPython 没有使用与我的 shell 相同的 $PATH 环境。

$ echo $PATH
/Users/jimmy/dev/anaconda/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/usr/texbin

$ ipython
In [1]: !echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/usr/texbin:/Users/jimmy/dev/anaconda/bin

它似乎打乱了路径顺序,我不太确定哪里出了问题。

我正在使用通过 oh-my-zsh 安装的 ZSH 作为 shell,如果它有帮助的话。

这是 sys.path() 返回的内容:

['',
'/Users/jimmy/dev/anaconda/bin',
'/Users/jimmy/dev/anaconda/lib/python2.7/site-packages/sparsesvd-0.2.2-py2.7-macosx-10.5-x86_64.egg',
'/Users/jimmy/dev/projects/pyresult',
'/Users/jimmy/dev/work/gavagai/userdata',
'/Users/jimmy/dev/work/gavagai/gavapi',
'/Users/jimmy/dev/anaconda/python.app/Contents/lib/python27.zip',
'/Users/jimmy/dev/anaconda/python.app/Contents/lib/python2.7',
'/Users/jimmy/dev/anaconda/python.app/Contents/lib/python2.7/plat-darwin',
'/Users/jimmy/dev/anaconda/python.app/Contents/lib/python2.7/plat-mac',
'/Users/jimmy/dev/anaconda/python.app/Contents/lib/python2.7/plat-mac/lib-scriptpackages',
'/Users/jimmy/dev/anaconda/python.app/Contents/lib/python2.7/lib-tk',
'/Users/jimmy/dev/anaconda/python.app/Contents/lib/python2.7/lib-old',
'/Users/jimmy/dev/anaconda/python.app/Contents/lib/python2.7/lib-dynload',
'/Users/jimmy/dev/anaconda/lib/python2.7/site-packages/runipy-0.1.0-py2.7.egg',
'/Users/jimmy/dev/anaconda/lib/python2.7/site-packages/setuptools-3.6-py2.7.egg',
'/Users/jimmy/dev/anaconda/lib/python2.7/site-packages',
'/Users/jimmy/dev/anaconda/lib/python2.7/site-packages/PIL',
'/Users/jimmy/dev/anaconda/lib/python2.7/site-packages/IPython/extensions',
'/Users/jimmy/.ipython']

这就是 os.environ['PATH'] 返回的内容:

'/Users/jimmy/dev/anaconda/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/usr/texbin'

两者似乎都按正确的顺序放置。

感谢所有帮助。

最佳答案

总结补充@holdenweb's helpful answer ,特别是关于 OS X:

  • 从 IPython 使用 ! 启动的子 shell 是用户默认值的非交互式 非登录实例 shell - 即使 IPython 是从一个不同的 shell 启动的。
    • 在幕后,子 shell 以 path/to/default/shell -c ...
    • 启动
    • 要查看具体信息,请运行 !ps -p $$ && :
  • echo $SHELL 总是 告诉您默认 shell - 即使从不同运行 shell 。

  • 初始化文件源自非交互式非登录 shell:

    • zsh:: /etc/zshenv~/.zshenv
    • bash:在 $BASH_ENV 变量中指向的脚本(如果已定义)。
  • 正如所指出的,shell 加载不同/额外的初始化文件取决于:

    • shell 是否是登录 shell
    • 是否有交互式 shell

    请注意,登录 shell 可以是交互式的也可以不是,交互式 shell 可以是登录 shell 也可以不是。

因此,在手头的案例中,两个 额外的初始化文件可能被加载到交互式 shell 中,解释了交互式 shell 和创建的子 shell 之间的行为差​​异通过 IPython:

  • ~/.zprofile - 如果 shell 是 login shell - 如果 zsh默认值 shell(在 OS X 上,在终端中创建的默认 shell 的所有交互式实例(例如 Terminal.app 都是登录 shell)。
  • ~/.zshrc

最后,在相关说明中,请注意在 OS X 上,非 shell 进程的默认 $PATH 是:

/usr/bin:/bin:/usr/sbin:/sbin  # Note the absence of /usr/local/bin.

并且只有 shell 添加 /usr/local/bin(默认;可扩展),通过系统级初始化文件(调用 /usr/libexec/path_helper):

  • zsh:
    • /etc/zshenv
    • 注意:对所有 zsh 实例都有效。
  • bash(当作为 sh 调用时),ksh:
    • /etc/profile
    • 注意:仅对 LOGIN shell 有效。

结果:

  • 非 shell 应用程序只能看到默认的 $PATH(值得注意的是,没有 /usr/local/bin 和通过 shell 初始化文件添加的其他内容)。
  • bash/shksh 非交互式非登录 shell 也从登录 shell 启动只看到默认的 $PATH。例如,当 GUI 命令行启动器(如 Alfred)时,就会发生这种情况。创建 shell 实例。
  • zsh 受到影响,因为/etc/zshenv每个 zsh 实例。

关于python - IPython 使用与 shell 不同的 $PATH 环境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24671897/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com