[英]PYTHONPATH is not read by IPython when installed via Homebrew
我在干凈的 macOS Catalina(虛擬機)上使用 Homebrew 安裝了 IPython 和 Python 3。
$ brew install ipython
由於ipython
package 依賴於python3
package,因此 Homebrew 將ipython
和python3
安裝在一起。
$ 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 安裝的ipython
和python3
具有不同的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.html : PYTHONPATH
:增加模塊文件的默認搜索路徑。 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.