Обновления
Последующий пост, где я сделал это в простую программу под названием 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, infrom 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, inmain() 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”