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

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

Как насчет пакетов сайтов? /usr/lib/python2.7/site-packages.
Является ли распространенным в python копирование и вставка пакета там?

Ответ 1

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

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

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


edit: он появится в sys.path после его создания:

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

Ответ 2

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

Откройте ваш терминал 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"

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

Ответ 3

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

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

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

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

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

Ответ 4

На моем 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.

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

Ответ 5

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

import sys
print sys.path

Пример автоматической генерации символической ссылки:

ln -s \'pip show em | grep "Location"| 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.