Страницы

Поиск по вопросам

Показаны сообщения с ярлыком pip. Показать все сообщения
Показаны сообщения с ярлыком pip. Показать все сообщения

среда, 22 января 2020 г.

Как установить whl-пакет не из PyPI, а зависимости из PyPI?

#python #pip


У меня есть жутко секретный whl-пакетик mysecretproject, который, условно говоря,
лежит в моём маленьком локалхостовом PyPI (каталог ли это, или pypiserver, или ещё
что-то — неважно, могу использовать что угодно для решения задачи, хотя чем проще и
изолированнее, тем лучше) и устанавливается оттуда. Предположим, что точная версия
пакета мне неизвестна (его могу делать не я, например), и мне нужно установить просто
последнюю доступную версию через pip.

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

Проблема в том, что pip в любом случае стучится одновременно и на локалхостовый PyPI,
и на публичный https://pypi.org/simple, чтобы  попытаться достать последнюю версию
whl-пакета оттуда.

Однако может случиться беда, и сверхсекретное название пакета случайно утечёт в интернетики
в одном из моих случайных скриншотов.

Злоумышленник, налюбовавшись на скриншот, заливает на pypi.org mysecretproject-99999.999.999,
в итоге мой pip ставит пакет не с локалхоста, а из pypi.org — и всё, моя система скомпрометирована!
Хочется как-то пофиксить эту проблему.

При этом прописать --no-index я тоже не могу, потому что зависимости нужно ставить
как раз из pypi.org (предположим, что они белые и пушистые, да). Точное имя whl-пакета
я заранее тоже не знаю (версия пакета условно произвольная и заливается из другого
моего локалхоста, например), поэтому просто скормить в pip прямой путь к whl-пакету
я тоже не могу.

Как бы мне вывернуться так, чтобы pip ставил один-единственный мой пакет из локалхоста,
а все его зависимости подтянул из pypi.org?

(Разработчики pip уже говорили, что --find-links и аналоги занимаются оптимизацией,
а не безопасностью, но безопасных аналогов мне найти так и не удалось)
    


Ответы

Ответ 1



Проблема в том, что pip в любом случае стучится одновременно и на локалхостовый PyPI, и на публичный https://pypi.org/simple, чтобы попытаться достать последнюю версию whl-пакета оттуда. Злоумышленник, налюбовавшись на скриншот, заливает на pypi.org mysecretproject-99999.999.999, в итоге мой pip ставит пакет не с локалхоста, а из pypi.org — и всё, моя система скомпрометирована! devpi решает обе проблемы. devpi может проксировать запросы на pypi.org: при запросе пакета devpi проверит, доступен ли пакет локально; если нет, то devpi перенаправит запрос на pypi.org. Чтобы сконфигурировать такое поведение, локальный индекс должен наследовать root/pypi. Если индекс не наследует root/pypi, установлены могут быть только пакеты, залитые непосредственно на индексе (индекс полностью изолирован). Установка и настройка сервера подробно описана в документации; чтобы перманентно прописать установку с локального зеркала, открой $HOME/.pip/pip.conf и добавь: [global] index-url=http://127.0.0.1:9000/me/myindex/+simple Поскольку используется index-url, pip будет использовать локальный репозитарий в качестве основного и единственного, игнорируя pypi.org. Дальше пакеты устанавливаются (или не устанавливаются) в зависимости от конфигурации индекса devpi (наследование root/pypi, описанное выше). От ситуации, когда злоумышленник залил вредоносную копию mysecretproject на pypi.org, защищает опция индекса mirror_whitelist. Если имя пакета НЕ добавлено в mirror_whitelist, то devpi позволит установить только версии пакета, залитые на индексе, игнорируя любые версии, залитые на pypi.org. Имена пакетов никогда не добавляются в mirror_whitelist автоматически (это можно сделать только вручную), так что все залитые на локальных индексах пакеты изначально защищены от спуфинга.

понедельник, 30 декабря 2019 г.

Command “python setup.py egg_info” failed with error code 1

#python #pip #psycopg2 #install


Устанавливаю pgAdmin 4.

pip install pgadmin4-1.1-py2-none-any.whl


И выводит в конце такое


  Command "python setup.py egg_info" failed with error code 1 in
  /tmp/pip-build-aofWrQ/psycopg2/


Полный текст:

Collecting psycopg2==2.6.2 (from pgadmin4==1.1)
  Downloading psycopg2-2.6.2.tar.gz (376kB)
    100% |████████████████████████████████| 378kB 2.1MB/s 
    Complete output from command python setup.py egg_info:
    running egg_info
    creating pip-egg-info/psycopg2.egg-info
    writing pip-egg-info/psycopg2.egg-info/PKG-INFO
    writing top-level names to pip-egg-info/psycopg2.egg-info/top_level.txt
    writing dependency_links to pip-egg-info/psycopg2.egg-info/dependency_links.txt
    writing manifest file 'pip-egg-info/psycopg2.egg-info/SOURCES.txt'
    Error: pg_config executable not found.

    Please add the directory containing pg_config to the PATH
    or specify the full executable path with the option:

        python setup.py build_ext --pg-config /path/to/pg_config build ...

    or with the pg_config option in 'setup.cfg'.

    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-aofWrQ/psycopg2/


То, что написано тут не помогает, по крайней мере первый ответ.
    


Ответы

Ответ 1



У вас не установлен psycorg2 (зависимость pgadmin4 вероятно). При установки pgadmin4, pip автоматически пытается установить необходимые зависимости (только Питон библиотеки—pip не ставит стороннее не Питон ПО как правило). Ошибка в вопросе возникает из-за попытки компиляции psycorg2 из исходников (не найдена команда pg_config). На моей системе, /usr/bin/pg_config находится в postgresql-common Ubuntu пакете (это не важно, так как фактическую системную установку sudo apt-get install python-psycopg2 или схожая команда выполняет). Установите psycorg2 нужной версии на вашу систему и повторите pip команду для pgadmin4. Нас интересует версия, которая видна pip команде: $ pip show psycopg2 Если хочется более новую версию из исходников собрать, то чтобы автоматически зависимости для компиляции поставить, можно выполнить: $ sudo apt-get build-dep python-psycopg2 И заново запустить pip install с желаемыми ограничениями на версию.

Ответ 2



Установите следующий пакет: sudo apt-get install libpq-dev

среда, 18 декабря 2019 г.

Как сменить версию python на ubuntu

#python #ubuntu #pip


Установил ubuntu, как я понял с ней вместе установился питон2.7 в папку /home/user/.local/lib
Я установил питон3.5 после чего через pip скачиваю всякие библиотки себе в частности
scipy и она устанавливается в папку питон2.7, а я не использую 2-ю версию питона. 

Помогите мне либо удалить питон 2.7, либо приоритезировать 3.5. 
В гуугле не могу найти достаточно информации чтоб решить. 
    


Ответы

Ответ 1



Используйте pip3 или python3 -m pip для запуска pip для Python 3 $ pip3 --version pip 9.0.1 from /home/r033/.local/lib/python3.5/site-packages (python 3.5) $ python3 -m pip --version pip 9.0.1 from /home/r033/.local/lib/python3.5/site-packages (python 3.5) Так же библиотеки можно устанавливать через репозитории Ubuntu, если они там есть. sudo apt install python3-scipy

Ответ 2



Попробуйте запускать pip так: sudo python3 -m pip P.S. A scipy для python3 в ubuntu можно так поставить: sudo apt-get install python3-scipy

Ответ 3



Если я Вас правильно понял, то Вам поможет: sudo ln -sf python3 /usr/bin/python Эта команда заменит ссылку на python в /usr/bin После этого, по запуску python будет открываться интерпретатор python3

воскресенье, 15 декабря 2019 г.

Установка pickle

#pip


В консоле windows ввожу команду pip install cpickle 

Collecting cpickle
  Downloading cpickle-0.5.tar.gz
    Complete output from command python setup.py egg_info:
    Traceback (most recent call last):
      File "", line 1, in                                       
                                             
      File "c:\users\kaz19\appdata\local\programs\python\python35\lib\tokenize.py",
line 454, in open                           
        buffer = _builtin_open(filename, 'rb')
    FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\kaz19\\AppData\\Local\\Temp\\pip-build-nnts2rx3\\cpickle\\setup.py'


Как это исправить?
    


Ответы

Ответ 1



Оказывается в python 3.5 он уже установлен и называется просто pickle

пятница, 29 ноября 2019 г.

Почему не стоит использовать sudo pip?

#python #ubuntu #pip


В одном из обсуждений на сайте, был поднят вопрос, о том, что плохо использовать
sudo pip. В силу того, что я не до конца понимаю этот аспект, то мне предложили задать
отдельный вопрос. Многим другим людям это тоже может быть полезно знать.
    


Ответы

Ответ 1



Почему НЕ стоит использовать sudo pip install? При установке пакета вы не просто размещаете его в своей файловой системе, но и выполняете скрипт setup.py. Поскольку в PyPI загрузить пакет может кто угодно, вы не можете быть уверены, что setup.py не содержит код, выполнение которого под пользователем root нежелательно/опасно/недопустимо. По уровню опасности это равносильно выполнению под суперпользователем shell-скрипта "из облака": wget -O - http://example.com/some/unsafe/script.sh | bash Как же быть? Вариант 1 Кроме случаев, когда вам крайне необходимо установить пакет из-под root-а, вы можете использовать pip install --user mypackage чтобы установить пакет в репозиторий текущего пользователя $HOME/.local/lib/pythonx.y/site-packages/. Вариант 2 Использовать изолированные окружения, например virtualenv. В этом случае у вас под рукой будет неограниченное количество рабочих окружений (например, под каждый проект, с разными версиями python), которые не будут мешать друг другу. Пакеты будут храниться в $HOME/.virtualenvs/$ENVNAME/lib/pythonx.y/site-packages/ вместе с нужной версией python и сторонними бинарниками, а переключение окружений выполняется командой workon $ENVNAME. IDE, вроде PyCharm, знают про виртуальные окружения и умеют с ними работать.

Ответ 2



Основная причина та же почему virtualenv существует: если у вас есть Питон-пакеты foo, bar, которые требуют разные версии libbaz библиотеки, то sudo pip install bar может обновить версию libbaz, сломав foo пакет, ожидающий более старую версию из системных пакетов. Гипотетический cценарий, но с реальными пакетами: допустим у вас стоял python-matplotlib Ubuntu пакет и вы обновили его до PyPI версии, используя sudo pip. На первый взгляд всё замечательно, вы успешно построили желаемый график. Через пару дней вы обнаружили, что поиск книг в calibre стал неустойчиво работать (не можете найти книгу по запросу, который раньше её находил). Потратив какое-то время на отладку проблемы, если вам повезёт, то вы сможете локализовать её к проблеме с версией pyparsing модуля, используемого как в calibre так и в matplotlib. То есть проблема с sudo pip install matplotlib -U не в том, что код с PyPI выполняется от имени root (c точки зрения безопасности, проблемы хуже, чем с sudo apt-get install python-matplotlib, но не особо для типичного разработчика -- можно даже gpg-подпись проверить для скаченного matplotlib wheel, если есть желание). Проблема в том, что sudo pip к трудно диагностируемым проблемам может вести из-за несоответствия ожидания пакетов, упакованных для apt-get и версий пакетов с PyPI. Именно поэтому, пакеты, которые должны быть особенно независимы, такие как pip, pkg_resources используют свою локальную копию: ._vendor.pyparsing. Иногда можно использовать радикальных подход и ставить каждую утилиту в своё virtualenv, к примеру, используя pipsi команду: $ pipsi install youtube-dl Это позволяет обновлять youtube-dl, не трогая пакеты, которые могут использоваться другим ПО на системе. И обратное, обновление других пакетов не сломает youtube-dl команду. Недостаток подобного подхода в том, что при исправлении дырки в безопасности в какой-нибудь зависимости, её придётся обновлять в каждом virtualenv отдельно. По сути, используя sudo pip, вы берёте на себя ответственность о том, что все установленные вами версии пакетов и их зависимости будут совместимы с пакетами, установленными системным менеджером пакетов сейчас и в будущем. Обычно это работа создателей Linux дистрибутивов, типа Ubuntu -- они стараются, чтобы версии пакетов, распространяемые в дистрибутиве, работали бы друг с другом. Устанавливая pip install --user , вы не сломаете программы, которые от другого пользователя запускаются. Ставя в virtualenv, вы изолируете систему от возможных изменений и наоборот (если --system-site-packages опция не указана при создании) изолируете пакеты внутри virtualenv от изменений в системе. Для удобства управления virtualenv, можно virtualenvwrapper поставить.

Ответ 3



Это актуально не только для pip, использование прав суперпользователя может быть черевато выполнением произвольного кода, который может навредить системе. Если не получается установить какой-то пакет без root'а, то, вероятно просто неверно выставленно разрешение на директорию с пакетами python

воскресенье, 7 июля 2019 г.

Как использовать Pip непосредственно из python скрипта?

К примеру как работать с pip через командную строку понятно:
pip install some_package
А вот как можно проверить установлен ли определенный пакет или нет, и если не установлен то установить его, и все это чтобы выполнялось в python скрипте?


Ответ

Рекомендованный путь использования pip внутри скрипта — запуск pip как внешней команды:
#!/usr/bin/env python import subprocess import sys
package = 'some_package' subprocess.check_call([sys.executable, '-m', 'pip', 'install', package])
Если пакет не установлен, то эта команда попытается его установить. Если пакет установлен, то более новая версия не будет ставиться. Если хотите самую новую версию поставить, то --upgrade можно передать
Отдельно команду по проверке установлен или нет пакет, если вы хотите чтобы у вас был установлен этот пакет, нет необходимости запускать.
Если не хотите видеть вывод pip команды, можно stdout=subprocess.DEVNULL передать. Чтобы stderr в то же место перенаправить, можно stderr=subprocess.STDOUT использовать.

суббота, 27 апреля 2019 г.

Command “python setup.py egg_info” failed with error code 1

Устанавливаю pgAdmin 4.
pip install pgadmin4-1.1-py2-none-any.whl
И выводит в конце такое
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-aofWrQ/psycopg2/
Полный текст:
Collecting psycopg2==2.6.2 (from pgadmin4==1.1) Downloading psycopg2-2.6.2.tar.gz (376kB) 100% |████████████████████████████████| 378kB 2.1MB/s Complete output from command python setup.py egg_info: running egg_info creating pip-egg-info/psycopg2.egg-info writing pip-egg-info/psycopg2.egg-info/PKG-INFO writing top-level names to pip-egg-info/psycopg2.egg-info/top_level.txt writing dependency_links to pip-egg-info/psycopg2.egg-info/dependency_links.txt writing manifest file 'pip-egg-info/psycopg2.egg-info/SOURCES.txt' Error: pg_config executable not found.
Please add the directory containing pg_config to the PATH or specify the full executable path with the option:
python setup.py build_ext --pg-config /path/to/pg_config build ...
or with the pg_config option in 'setup.cfg'.
---------------------------------------- Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-aofWrQ/psycopg2/
То, что написано тут не помогает, по крайней мере первый ответ.


Ответ

У вас не установлен psycorg2 (зависимость pgadmin4 вероятно). При установки pgadmin4, pip автоматически пытается установить необходимые зависимости (только Питон библиотеки—pip не ставит стороннее не Питон ПО как правило).
Ошибка в вопросе возникает из-за попытки компиляции psycorg2 из исходников (не найдена команда pg_config). На моей системе, /usr/bin/pg_config находится в postgresql-common Ubuntu пакете (это не важно, так как фактическую системную установку sudo apt-get install python-psycopg2 или схожая команда выполняет).
Установите psycorg2 нужной версии на вашу систему и повторите pip команду для pgadmin4.
Нас интересует версия, которая видна pip команде:
$ pip show psycopg2
Если хочется более новую версию из исходников собрать, то чтобы автоматически зависимости для компиляции поставить, можно выполнить:
$ sudo apt-get build-dep python-psycopg2
И заново запустить pip install с желаемыми ограничениями на версию.

среда, 13 марта 2019 г.

Установка pickle

В консоле windows ввожу команду pip install cpickle
Collecting cpickle Downloading cpickle-0.5.tar.gz Complete output from command python setup.py egg_info: Traceback (most recent call last): File "", line 1, in File "c:\users\kaz19\appdata\local\programs\python\python35\lib\tokenize.py", line 454, in open buffer = _builtin_open(filename, 'rb') FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\kaz19\\AppData\\Local\\Temp\\pip-build-nnts2rx3\\cpickle\\setup.py'
Как это исправить?


Ответ

Оказывается в python 3.5 он уже установлен и называется просто pickle

среда, 5 декабря 2018 г.

Как сменить версию python на ubuntu

Установил ubuntu, как я понял с ней вместе установился питон2.7 в папку /home/user/.local/lib Я установил питон3.5 после чего через pip скачиваю всякие библиотки себе в частности scipy и она устанавливается в папку питон2.7, а я не использую 2-ю версию питона.
Помогите мне либо удалить питон 2.7, либо приоритезировать 3.5. В гуугле не могу найти достаточно информации чтоб решить.


Ответ

Используйте pip3 или python3 -m pip для запуска pip для Python 3
$ pip3 --version pip 9.0.1 from /home/r033/.local/lib/python3.5/site-packages (python 3.5) $ python3 -m pip --version pip 9.0.1 from /home/r033/.local/lib/python3.5/site-packages (python 3.5)
Так же библиотеки можно устанавливать через репозитории Ubuntu, если они там есть.
sudo apt install python3-scipy

вторник, 9 октября 2018 г.

Почему не стоит юзать sudo pip?

В одном из обсуждений на сайте, был поднят вопрос, о том, что плохо юзать sudo pip. В силу того, что я не до конца понимаю этот аспект, то мне предложили задать отдельный вопрос, так как многим другим людям это тоже может быть полезно знать.


Ответ

Это актуально не только для pip, использование прав суперпользователя может быть черевато выполнением произвольного кода, который может навредить системе.
Если не получается установить какой-то пакет без root'а, то, вероятно просто неверно выставленно разрешение на директорию с пакетами python