PYTHONPATH не читается I Python при установке через Homebrew - PullRequest
0 голосов
/ 21 апреля 2020

Я установил I Python и Python 3, используя Homebrew на чистой MacOS Catalina (виртуальная машина).

$ brew install ipython

Поскольку пакет ipython зависит от пакета python3 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)

Я ожидал, что обе эти две команды прочитают PYTHONPATH из моей оболочки, потому что ipython работает так, когда он устанавливается pip3 install ipython.

Однако ipython и python3, установленные с помощью Homebrew, имеют различные настройки 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. Почему я Python читает PYTHONPATH, когда он установлен pip3 install ipython?

Ответы [ 3 ]

0 голосов
/ 03 мая 2020

Q1. Почему они (то есть sys.path) отличаются?

Заполнение sys.path обычно выполняется следующим образом: 1) текущий рабочий каталог, а затем 2) каталоги, перечисленные в переменной среды PYTHONPATH, затем 3) пути по умолчанию, зависящие от установки, которые контролируются модулем site. С https://docs.python.org/3/using/cmdline.html: PYTHONPATH: увеличить путь поиска по умолчанию для файлов модулей. См. Также, например, 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'] )

Например, у меня есть spyder3 и python3 .8 под Ubuntu 20.04. При запуске в одном и том же CLI каждый имеет свой собственный sys.path, оба "получены" из одного и того же PYTHONPATH.

Q2. Это ожидаемое поведение?

Да.

Q3. Почему я Python читает PYTHONPATH, когда он установлен pip3 install ipython?

Пожалуйста, укажите значение PYTHONPATH ($ echo $PYTHONPATH) до выполнения любого из питонов в CLI , Не очевидно, что они читают или не читают его значение.

Пожалуйста, отправьте сообщение, если это поможет найти причину.

0 голосов
/ 03 мая 2020

Это сводится к следующей строке в рецепте Homebrew для ipython:

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

Создает сценарий /usr/local/bin/ipython, который устанавливает PYTHONPATH в фиксированное значение это необходимо для правильной работы I Python (поскольку его модули находятся за пределами каталога Python модуля по умолчанию) перед вызовом исполняемого файла ipython:

#!/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/...

Это добавит его к вашему PYTHONPATH вместо того, чтобы полностью переопределить его, но файл будет перезаписан при обновлении или переустановке пакета Homebrew. Поэтому рекомендуется вместо этого поместить в каталог запуска I Python ~/.ipython/profile_default/startup скрипт, скажем root.py, который выглядит следующим образом:

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

При установке ipython с использованием pip, его модули go находятся в каталоге модулей по умолчанию Python, будь то системный пользователь или пользовательский, или пользователь в виртуальной среде, и нет необходимости связываться с PYTHONPATH, чтобы ipython работал правильно.

Я бы сказал, что ответ на Q2 заключается в том, что это, вероятно, ошибка, и вы можете отправить вопрос с Homebrew на GitHub, хотя я не задерживаю дыхание, учитывая то, как они относились та же проблема с Jupyter .

0 голосов
/ 21 апреля 2020

Я ожидал, что обе эти команды читают PYTHONPATH из моей оболочки.

Они обе читают PYTHONPATH. Вы можете выполнить следующий эксперимент:

PYTHONPATH=/tmp python3 -c 'import sys; print(sys.path)'
PYTHONPATH=/tmp ipython -c 'import sys; print(sys.path)'
PYTHONPATH=/mnt python3 -c 'import sys; print(sys.path)'
PYTHONPATH=/mnt ipython -c 'import sys; print(sys.path)'

Однако i python и python3, установленные с помощью Homebrew, имеют разные настройки sys.path.

Ничего не имеет делать с предыдущим утверждением. Они должны не иметь одинаковые пути.

Q1. Чем они отличаются?

Они разделяют некоторые пути друг с другом, но спецификации i python c не работают нормально python и, следовательно, не включены.
У обоих также есть путь, который указывает на их указанных пользователем c. Во время установки pip вы можете указать флаг, который запрещает устанавливать пакет глобально.

Q2. Это ожидаемое поведение?

Да.

Q3. Почему я Python читает PYTHONPATH, когда он устанавливается pip3 install i python?

не имеет ничего общего с pip. Стандартное и ожидаемое поведение. я python является подмножеством python. И поскольку это стандартная функция python, они оба читают PYTHONPATH.

...