Где я должен поставить свой собственный модуль Python, чтобы он мог быть импортирован

У меня есть собственный пакет на Python, и я использую его очень часто. Каков самый элегантный или обычный каталог, куда я должен поместить свой пакет, чтобы он мог быть импортирован без использования PYTHONPATH или sys.path?

Как насчет сайта-пакетов, например?/usr/lib/python2.7/site-packages,
Часто ли в Python копировать и вставлять туда пакеты?

5 ответов

Решение

Я обычно помещаю материал, который хочу иметь готовым для импорта, в каталог сайта пользователя:

~/.local/lib/pythonX.X/site-packages

Чтобы показать правильный каталог для вашей платформы, вы можете использовать python -m site --user-site


редактировать: он будет отображаться в sys.path как только вы создадите это:

mkdir -p "`python -m site --user-site`"

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

Откройте свой терминал Python. Импортируйте модуль, который, как вы знаете, работает, например, numpy, в моем случае и выполните следующие действия. Import numpy

numpy.__file__

что приводит к

'/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site- packages/numpy/__init__.py'

Результат numpy.__file__ это место, куда вы должны поместить файл python с вашим модулем (исключая numpy/__init__.py) так для меня это было бы

/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site- packages

Для этого просто зайдите в свой терминал и введите

mv "location of your module" "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site- packages"

Теперь вы сможете импортировать свой модуль.

Это то, что работает для меня (мне часто приходится создавать пакеты python, которые загружаются в частный репозиторий pip). уточняя комментарий @joran по этому вопросу.

  1. создать "каталог сборки", который используется в качестве рабочего пространства для создания пакетов. подойдет любой каталог по вашему выбору
  2. Скопируйте туда каталог вашего пакета python и создайте файл setup.py. это должно помочь в создании setup.py правильно.
  3. создать virtualenv для проекта, над которым вы работаете. У virtualenvs есть масса других преимуществ, я не буду вдаваться в подробности.
  4. создать локальный пакет dist python setup.py sdist --format=tar, созданный пакет в идеале должен находиться в dist папка.
  5. Установите пакет на свой virtualenv (после его активации). pip install <yourpackage>.tar

ты можешь использовать pip install --force-reinstall если вам нужно больше поиграться с библиотеками и заново создать пакеты dist.

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

Счастливого взлома.

Если вы разрабатываете модуль, я бы рекомендовал следовать этому.

import sys
sys.path.append("/home/mylinux/python-packages")

Теперь любой модуль, в котором вы находитесь python-packages импортируется Python-interpreter.

На моем Mac я сделал sudo find / -name "site-packages", Это дало мне несколько путей, как /Library/Python/2.6/site-packages, /Library/Python/2.7/site-packages, а также /opt/X11/lib/python2.6/site-packages,

Итак, я знал, где разместить свои модули, если я использовал v2.7 или v2.6.

Надеюсь, поможет.

Пример:

ln -s `pip show em | grep "Местоположение"| cut -d " " -f2` `python -m site --user-site`

вместо "em" вы можете использовать другой пакет, который вы "только что установили, но питон не видит"

ниже я объясню более подробно, как того требует запрос в комментарии.

Предположим, вы установили модуль python em или pyserial с помощью следующей команды (примеры для Ubuntu):

sudo pip install pyserial

и вывод выглядит так:

Collecting pyserial
  Downloading pyserial-3.3-py2.py3-none-any.whl (189kB)
    100% |████████████████████████████████| 194kB 2.3MB/s 
Installing collected packages: pyserial
Successfully installed pyserial-3.3

вопрос будет следующий - python не видит модуль pyserial, почему? потому что место, где был установлен модуль, не тот питон, который ищет вашу конкретную учетную запись пользователя.

решение - мы должны создать символическую ссылку от пути, где Pyserial прибыл на путь, где ищет ваш питон.

Команда создания символической ссылки будет:

ln -s <what_to_link> <where_to_link>

вместо того, чтобы вводить точное местоположение, мы просим pip сообщить нам, где он хранит модули, выполнив команду:

pip show pyserial | grep "Location"| cut -d " " -f2

вместо того, чтобы вводить точное местоположение, мы просим python сообщить нам, где он ищет устанавливаемые модули, выполнив команду:

python -m site --user-site

обе команды должны быть экранированы символом "" (обычно слева от вашей кнопки 1 для клавиатуры США)

в результате для ln будет предоставлена ​​следующая команда и будет создана отсутствующая символическая ссылка:

ln -s /usr/local/lib/python2.7/dist-packages /home/<your_username>/.local/lib/python2.7/site-packages 

или что-то подобное, в зависимости от вашего дистрибутива и значений по умолчанию Python / PIP.

Другие вопросы по тегам