Где я должен поставить свой собственный модуль 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 по этому вопросу.
- создать "каталог сборки", который используется в качестве рабочего пространства для создания пакетов. подойдет любой каталог по вашему выбору
- Скопируйте туда каталог вашего пакета python и создайте файл setup.py. это должно помочь в создании setup.py правильно.
- создать virtualenv для проекта, над которым вы работаете. У virtualenvs есть масса других преимуществ, я не буду вдаваться в подробности.
- создать локальный пакет dist
python setup.py sdist --format=tar
, созданный пакет в идеале должен находиться вdist
папка. - Установите пакет на свой 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.