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