簡體   English   中英

通過 Homebrew 安裝時,IPython 不會讀取 PYTHONPATH

[英]PYTHONPATH is not read by IPython when installed via Homebrew

我在干凈的 macOS Catalina(虛擬機)上使用 Homebrew 安裝了 IPython 和 Python 3。

$ brew install ipython

由於ipython package 依賴於python3 package,因此 Homebrew 將ipythonpython3安裝在一起。

$ brew info ipython 
ipython: stable 7.13.0 (bottled), HEAD
Interactive computing in Python
https://ipython.org/
/usr/local/Cellar/ipython/7.13.0 (2,905 files, 21.8MB) *
  Poured from bottle on 2020-04-15 at 18:48:22
From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/ipython.rb
==> Dependencies
Required: python ✔, zeromq ✔
==> Options
--HEAD
    Install HEAD version
==> Analytics
install: 11,543 (30 days), 33,591 (90 days), 98,995 (365 days)
install-on-request: 5,404 (30 days), 15,768 (90 days), 49,364 (365 days)
build-error: 0 (30 days)

我希望這兩個命令都從我的 shell 環境中讀取PYTHONPATH ,因為ipython在通過pip3 install ipython時可以正常工作。

但是使用 Homebrew 安裝的ipythonpython3具有不同的sys.path設置。

$ which ipython
/usr/local/bin/ipython
$ which python3
/usr/local/bin/python3
$ ipython 
Python 3.7.7 (default, Mar 10 2020, 15:43:33) 
Type 'copyright', 'credits' or 'license' for more information
IPython 7.13.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: import sys; sys.path                                                                                            
Out[1]: 
['/usr/local/Cellar/ipython/7.13.0/libexec/bin',
 '',
 '/usr/local/Cellar/ipython/7.13.0/libexec/lib/python3.7/site-packages',
 '/usr/local/Cellar/ipython/7.13.0/libexec/vendor/lib/python3.7/site-packages',
 '/usr/local/Cellar/python/3.7.7/Frameworks/Python.framework/Versions/3.7/lib/python37.zip',
 '/usr/local/Cellar/python/3.7.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7',
 '/usr/local/Cellar/python/3.7.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/lib-dynload',
 '/usr/local/lib/python3.7/site-packages',
 '/usr/local/Cellar/ipython/7.13.0/libexec/lib/python3.7/site-packages/IPython/extensions',
 '/Users/oxon/.ipython']

$ python3
Python 3.7.7 (default, Mar 10 2020, 15:43:33) 
[Clang 11.0.0 (clang-1100.0.33.17)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys; sys.path
['', '/Users/oxon/root-6.20.02/obj/lib', '/usr/local/Cellar/python/3.7.7/Frameworks/Python.framework/Versions/3.7/lib/python37.zip', '/usr/local/Cellar/python/3.7.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7', '/usr/local/Cellar/python/3.7.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/lib-dynload', '/usr/local/lib/python3.7/site-packages']

Q1。 為什么它們不同?

Q2。 這是預期的行為嗎?

Q3。 為什么 IPython 在通過pip3 install ipython安裝時會讀取PYTHONPATH

它歸結為ipython的 Homebrew 配方中的以下行

bin.env_script_all_files(libexec/"bin", :PYTHONPATH => ENV["PYTHONPATH"])

在調用ipython可執行文件之前,它會創建/usr/local/bin/ipython腳本,將PYTHONPATH設置為 IPython 正常工作所需的固定值(因為其模塊位於默認 Python 模塊目錄之外):

#!/bin/bash
PYTHONPATH="/usr/local/Cellar/ipython/7.14.0/libexec/lib/python3.8/site-packages:/usr/local/Cellar/ipython/7.14.0/libexec/vendor/lib/python3.8/site-packages" exec "/usr/local/Cellar/ipython/7.14.0/libexec/bin/ipython" "$@"

它只是覆蓋了您設置的PYTHONPATH值。 您可以將腳本修改為:

PYTHONPATH="$PYTHONPATH:/usr/local/Cellar/...

這將使 append 成為您的PYTHONPATH而不是完全覆蓋它,但是當 Homebrew package 更新或重新安裝時,該文件將被覆蓋。 因此,建議在 IPython 啟動目錄~/.ipython/profile_default/startup中放置一個腳本,例如root.py ,如下所示:

import sys
sys.path.append('/Users/oxon/root-6.20.02/obj/lib')

When you install ipython using pip , its modules go into the default Python module directory, be it the system one or the user one or the one in the virtual environment, and it is not necessary to mess with PYTHONPATH for ipython to function correctly.

因此,我想說Q2的答案是它可能是一個錯誤,您可以在 GitHub 上提交 Homebrew 的問題,盡管考慮到他們如何處理與 Jupyter 相同的問題,我不會屏住呼吸。

Q1。 為什么它們(即sys.path )不同?

sys.path的填充方式通常是:1) 當前工作目錄,然后是 2) PYTHONPATH 環境變量中列出的目錄,然后是 3) 依賴於安裝的默認路徑,這些路徑由site模塊控制。 來自https://docs.python.org/3/using/cmdline.htmlPYTHONPATH :增加模塊文件的默認搜索路徑。 See also eg, https://leemendelowitz.github.io/blog/how-does-python-find-packages.html https://realpython.com/lessons/module-search-path/ https: //docs.microsoft .com/en-us/visualstudio/python/search-paths?view=vs-2019

因此,每個 python 安裝可能有自己的sys.path 另外, sys.path不需要等於PYTHONPATH

檢查兩個(或三個?)案例中的每一個案例的值並回發:

import os
print( 'PYTHONPATH = ', os.environ['PYTHONPATH'] )

例如,我在 Ubuntu 20.04 下有 spyder3 和 python3.8。 在同一個 CLI 啟動時,每個都有自己的sys.path ,兩者都“派生”自同一個PYTHONPATH

Q2。 這是預期的行為嗎?

是的。

Q3。 為什么 IPython 在通過pip3 install ipython安裝時會讀取PYTHONPATH

請在 CLI 執行任一 python 之前發布PYTHONPATH ( $ echo $PYTHONPATH ) 的值。 不清楚他們是否正在閱讀它的價值。

如果這有助於找到原因,請回帖。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM