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

86

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

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

Кобри
источник
1
создайте setup.py, который сообщает о зависимостях, а что нет, и используйте это лучше, и он будет более переносимым ... но да, обычно копирование / вставка будет работать нормально ... хотя я обычно делаю дополнительную папку с именем "user / lib / "или что-то в этом роде и поместите их все туда и просто убедитесь, что они на моем PYTHONPATH
Джоран Бизли
1
НАСТОЯЩИЙ ответ: мне не нравятся другие ответы ни для личных простых скриптов / нераспространяемых пакетов, таких как @JoranBeasley: создайте какую-нибудь папку для хранения ваших скриптов (или ссылки на них) и добавьте эту папку в PYTHONPATH из вашего bash дерево runcom (например, вставьте скрипты / ссылки ~/foo/bar/, добавьте export PYTHONPATH=~/foo/bar # fields separated by ":"в свой ~/.bashrcфайл). Видите ли man python, этот ручной путь предшествует пути поиска python по умолчанию. Осторожно с коллизиями имен.

Ответы:

60

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

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

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


изменить: он появится, как sys.pathтолько вы его создадите:

mkdir -p "`python -m site --user-site`"
мата
источник
когда я открываю python с терминала, это дает sys.path. обратите внимание, что нет локальных ['', '/usr/lib64/python27.zip', '/usr/lib64/python2.7', '/usr/lib64/python2.7/plat-linux2', '/ usr / lib64 / python2.7 / lib-tk ',' /usr/lib64/python2.7/lib-old ',' /usr/lib64/python2.7/lib-dynload ',' /usr/lib64/python2.7 / сайт-пакеты ',' /usr/lib64/python2.7/site-packages/PIL ',' /usr/lib64/python2.7/site-packages/gst-0.10 ',' / usr / lib64 / python2. 7 / site-packages / gtk-2.0 ',' /usr/lib/python2.7/site-packages ',' /usr/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg -info ']
Cobry
при выполнении сценария это то, что он дает ['/ home / username / Desktop / mypackage / Examples', '/usr/lib64/python27.zip', '/usr/lib64/python2.7', '/ usr / lib64 /python2.7/plat-linux2 ',' /usr/lib64/python2.7/lib-tk ',' /usr/lib64/python2.7/lib-old ',' /usr/lib64/python2.7/ lib-dynload ',' /usr/lib64/python2.7/site-packages ',' /usr/lib64/python2.7/site-packages/PIL ',' /usr/lib64/python2.7/site-packages /gst-0.10 ',' /usr/lib64/python2.7/site-packages/gtk-2.0 ',' /usr/lib/python2.7/site-packages ',' /usr/lib/python2.7/ site-packages / setuptools-0.6c11-py2.7.egg-info ']
Cobry
python -m site --user-site /home/username/.local/lib/python2.7/site-packages, но этого нет среди sys.path !!
Cobry
@Cobry python -m site --user-siteсообщит вам, какой каталог вам следует создать. Он не появится, sys.modulesпока вы его не создадите.
Ая
@mata Вам, вероятно, следует изменить mkdirна, mkdir -pчтобы создать промежуточные каталоги. У меня даже не было ~/.local. ;-)
Aya
27

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

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

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

arie64
источник
Почему на моем Python "._file_" не работает? >>> import re >>> re._file_ Traceback (последний вызов последний): файл "<pyshell # 10>", строка 1, в <module> re._file_ AttributeError: модуль 're' не имеет атрибута ' file '
Urso
3
@Urso Вы уверены, что используете два символа подчеркивания? У re.__file__меня команда сработала.
arie64 03
Большое спасибо @ arie64 за такое чистое решение. Мне тоже понравилось !!
Bms bharadwaj 08
Спасибо, это сработало и для меня. Но, как ни странно, я не могу найти каталог / папку, в которую я отправил свой модуль, в проводнике файлов. Похоже, что папки не существует. Любая идея, почему папка не отображается там, где она должна? (Я включил "показывать скрытые элементы", поэтому дело не только в этом ...)
Андре
7

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

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

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

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

Удачного взлома.

SRJ
источник
1

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

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

Тестирование123
источник
1

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

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, почему? потому что место, где был установлен модуль, не является тем местом, которое python ищет для вашей конкретной учетной записи.

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

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

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.

Олег Кокорин
источник
Похоже, мощный однострочный ... не могли бы вы немного объяснить нам, новичкам в Linux? Люди могут опасаться использовать что-то, чего они не понимают :-)
pianoJames
-1

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

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

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

А.А. Шакиль
источник