Рубрики
Без рубрики

Python Local-Packages, à la npm node_modules

Обновления последующего сообщения, где я сделал это в простую программу под названием PIPM. * * * ************* … с меткой Python, Pip, NPM.

Обновления

Последующий пост, где я сделал это в простую программу под названием PIPM. * * * ************* ## ***********

Во-первых, эта вещь не существует. В отличие от NPM или PHP композитора, упаковочные инструменты в Python по умолчанию будут сначала установить в локацию глобальных пакетов.

В NPM или Composer, если вы не укажете NPM установить -G Затем по умолчанию пакет будет установлен в папку Node_Modules в корне проекта. Это довольно интуитивно понятно, локальный первый, тогда глобальный.

В Pyphon Python, если вы не хотите устанавливать в каталог глобальных пакетов, вы можете ограничить его - Узер флаг. Например:-

python3 -mpip install --user requests

На Linux выше команда обычно будет установлена Запросы Пакет для пользователя $ Home/.local/lib/python3.x/сайт-пакеты каталог. Вы можете увидеть, что это только «местный» пользователю, а не в отличие от NPM Node_Modules выше.

В Python решение состоит в том, чтобы использовать VirtualenV. Однако использовать VirtualenV, есть как минимум 2 школы преподавателя. Первое, а также большинство – поставить Virtualenv внешний на ваш проект.

Таким образом, вы можете создать каталог в вашем $ Home/.virtualenvs хранить всю вашу виртуальную среду. Создание нового Virtualenv может выглядеть так: –

python3 -mvenv $HOME/.virtualenvs/myproject

Затем вы будете «активировать» среду, чтобы сделать его активным: –

source $HOME/.virtualenvs/myproject/bin/activate

Отныне, когда вы запускаете Python На самом деле это призвана $ Home/.virtualenvs/myproject/bin/python Отказ А также Любые пакеты, которые вы устанавливаете с PIP, например: –

python -mpip install requests

установит библиотеку запросов на $ Home/.virtualenvs/myproject/lib/python3.x/Сайт-пакеты/Запросы Отказ

Но все это вручную было утомительным, поэтому есть такие инструменты, такие как VirtualenVWRapper, или современные инструменты, такие как Pipenv или поэзия, которая автоматически создает для вас VirtualenV.

Однако мне не нравится этот подход. Забывая «активировать» виртуальн или худший, активирующий неправильный VirtualenV для вашего проекта, является одним из самых болезненных опытом отладки.

Поэтому я во втором лагере, который создает виртуальский внутри нашего проекта Dir. Например, если у меня есть проект в $ Home/myProject , Я сделаю:-

cd $HOME/myproject
python -mvenv venv

Поэтому приведенная выше команда создаст VirtualenV в каталоге проекта – $ Home/MyProject/Venv. Отныне, когда мне нужно призвать питона, я бегу ./venv/bin/python от моего корня проекта. Установить пакеты, я бегу: –

./venv/bin/python -mpip install requests

Это будет установить Запросы к ./VENV/LIB/PYTHON3.x/Site-Packages Отказ Явное лучше, чем неявное.

При использовании поэзии вы можете добиться аналогичного эффекта, имея в вашем проекте Поэзия. Томль : –

[virtualenvs]
in-project = true

ОК, вернемся к оригинальной теме. Что если мы не хотим использовать VirtualenV? К счастью, Pip имеет флаг под названием --target Где, если указано, он установит пакет в местоположение цели. Например:-

python -mpip install -t local-packages requests

(Используя имя локальные пакеты в качестве игры на сайта-пакеты )

Приведенная выше команда будет установлена запросы к каталогу Местные пакеты , который вы можете создавать в вашем корне проекта, похоже на node_modules. .

Недавняя версия PIP также создала исполняемый сценарий пакета (если у них есть) в Местные пакеты/Bin каталог. Например, если мы устанавливаем пакет httpie, которые предоставляют исполняемый скрипт с именем http в Местные пакеты/Bin/http Отказ

К сожалению, если мы попытаемся запустить исполняемый скрипт, он не удастся: –

./local-packages/bin/http 
Traceback (most recent call last):
  File "./local-packages/bin/http", line 6, in 
    from httpie.__main__ import main
ModuleNotFoundError: No module named 'httpie'

Это не удивительно, так как ./local-packages dir (который имеет наши пакеты httpie) не на Python sys.path Какой список путей, где Python ищите модули для импорта. Мы можем проверить это через интерактивную консоль: –

python
>>> import sys
>>> sys.path
['', '/usr/lib/python37.zip', '/usr/lib/python3.7', '/usr/lib/python3.7/lib-dynload', '/home/kamal/.local/lib/python3.7/site-packages', '/usr/lib/python3.7/site-packages']

Чтобы добавить дополнительный путь, мы можем указать Pythonpath Переменная среды: –

PYTHONPATH=$PWD/local-packages ./local-packages/bin/http https://httpbin.org/get
HTTP/1.1 200 OK
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: *
Connection: keep-alive
Content-Encoding: gzip
Content-Length: 177
Content-Type: application/json
Date: Mon, 25 Nov 2019 22:36:19 GMT
Referrer-Policy: no-referrer-when-downgrade
Server: nginx
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block

{
    "args": {},
    "headers": {
        "Accept": "*/*",
        "Accept-Encoding": "gzip, deflate",
        "Host": "httpbin.org",
        "User-Agent": "HTTPie/1.0.3"
    },
    "origin": "14.192.213.59, 14.192.213.59",
    "url": "https://httpbin.org/get"
}

Так что это работает сейчас. Но есть один Готча. Если каким-то образом у нас есть httpie Уже установлены в глобальном или пользовательском сайте-пакетам, что, вероятно, приведет вместо того, у нас есть в нашем локальные пакеты . Это плохое и может вызвать другую головную боль при отладке. И это причина, по которой мы используем Virtualenv. Но мы не хотим использовать Virtualenv, верно?

К счастью, у Питона есть другой флаг. -S Флаг отключит обработку сайта-пакетов. От Документы : –

Отключите импорт сайта модуля и, зависящих от сайта манипуляций Sys.Path, который он влечет за собой. Также отключите эти манипуляции, если сайт явно импортируется позже (вызов Site.main (), если вы хотите, чтобы они были вызваны).

Но мы столкнулись с другой проблемой, если мы призываем Python с -S флаг:-

PYTHONPATH=$PWD/local-packages python -S -mhttpie https://httpbin.org/get
Traceback (most recent call last):
  File "/usr/lib/python3.7/runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "/usr/lib/python3.7/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/home/kamal/python/testpip/local-packages/httpie/__main__.py", line 18, in 
    main()
  File "/home/kamal/python/testpip/local-packages/httpie/__main__.py", line 10, in main
    from .core import main
  File "/home/kamal/python/testpip/local-packages/httpie/core.py", line 23, in 
    from httpie.client import get_response
  File "/home/kamal/python/testpip/local-packages/httpie/client.py", line 8, in 
    from httpie import sessions
  File "/home/kamal/python/testpip/local-packages/httpie/sessions.py", line 11, in 
    from httpie.plugins import plugin_manager
  File "/home/kamal/python/testpip/local-packages/httpie/plugins/__init__.py", line 10, in 
    from httpie.plugins.manager import PluginManager
  File "/home/kamal/python/testpip/local-packages/httpie/plugins/manager.py", line 2, in 
    from pkg_resources import iter_entry_points
ModuleNotFoundError: No module named 'pkg_resources'

Давайте попробуем копировать модуль PKG_Resources в наш Местные пакеты dir: –

cp -a /usr/lib/python3.7/site-packages/pkg_resources local-packages/

Не повезло. Мы узнаем, что нам нужны эти модули доступны: –

  • pkg_resources.
  • шесть
  • appdirs
  • упаковка
  • пейпарсинг

И оказалось, что все эти модули фактически являются частью уставов, другого зверя в упаковке Python. Так короче, чтобы сделать наши Местные пакеты Работает, нам нужно также установить STYPUTHOOLS: –

python -mpip install -t local-packages setuptools
python -mpip install -t local-packages httpie

А также Теперь вызывающий Python с -S Флаг должен работать: –

PYTHONPATH=$PWD/local-packages python -S -mhttpie https://httpbin.org/get
HTTP/1.1 200 OK
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: *
Connection: keep-alive
Content-Encoding: gzip
Content-Length: 177
Content-Type: application/json
Date: Tue, 26 Nov 2019 00:15:54 GMT
Referrer-Policy: no-referrer-when-downgrade
Server: nginx
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block

{
    "args": {},
    "headers": {
        "Accept": "*/*",
        "Accept-Encoding": "gzip, deflate",
        "Host": "httpbin.org",
        "User-Agent": "HTTPie/1.0.3"
    },
    "origin": "14.192.213.59, 14.192.213.59",
    "url": "https://httpbin.org/get"
}

Вот и все. Наконец, мы сможем призвать Python, бесплатно от глобальных сайтов-пакетов и используя наши Местные пакеты Dir Чтобы разместить все зависимости для нашего проекта.

Конечные заметки: на практике мы используем Создание достичь такими же целями.

Оригинал: “https://dev.to/k4ml/python-local-packages-a-la-npm-nodemodules-3240”