Куди слід покласти власний модуль python, щоб його можна було імпортувати


86

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

Як щодо пакетів сайтів, наприклад? /usr/lib/python2.7/site-packages.
Чи часто в python копіюється та вставляється туди пакет?


1
зробіть setup.py, який повідомляє про залежності, а що ні, і використовуйте кращу практику і буде більш портативним ... але так, як правило, копіювання / вставлення буде працювати нормально ... хоча я зазвичай роблю додаткову папку під назвою "user / lib / "або щось інше, і помістіть їх усіх туди і просто переконайтеся, що це на моєму ПІФОНПАТІ
Джоран Бізлі,

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 / site-пакети ',' /usr/lib64/python2.7/site-packages/PIL ',' /usr/lib64/python2.7/site-packages/gst-0.10 ',' / usr / lib64 / python2. 7 / site-пакети / gtk-2.0 ',' /usr/lib/python2.7/site-packages ',' /usr/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg -info ']
Кобрі

при виконанні сценарію він дає те, що ['/ 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 ']
Кобрі

python -m site --user-site /home/username/.local/lib/python2.7/site-packages, але це не серед sys.path !!
Кобрі

@Cobry python -m site --user-siteпідкаже, який каталог слід створити. Він не з’явиться, sys.modulesпоки ви насправді його не створили.
Айя,

@mata Вам, мабуть, слід змінити mkdirна, mkdir -pщоб створити проміжні каталоги. У мене навіть не було ~/.local. ;-)
Ая,

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"

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


Як так у мого Python, "._file_" не працює? >>> імпорт re >>> re._file_ Traceback (останній виклик останній): Файл "<pyshell # 10>", рядок 1, у <module> re._file_ AttributeError: модуль 're' не має атрибута ' file '
Urso

3
@Urso Ви впевнені, що використовуєте два підкреслення? Команда re.__file__спрацювала на мене.
arie64

Велике спасибі, @ arie64 за таке чисте рішення. Попрацював добре для мене також !!
Bms bharadwaj

Дякую, це спрацювало і на мене. Але дивним чином я не можу знайти каталог / папку, куди я надіслав свій модуль, у Провідник файлів. Здається, що папки не існує. Будь-яка ідея, чому папка не відображається там, де повинна? (Я ввімкнув "показувати приховані елементи", тож це не просто так ...)
Андре,

7

Це щось, що працює для мене (мені доводиться часто створювати пакети 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.

Я виявив, що цей метод для мене чудово працює. Якщо вам не потрібно пакувати модулі для використання інших систем, а не лише локальної, цей метод може бути надмірним

Щасливого злому.


1

На своєму Mac я зробив a 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.

Сподіваюся, це допоможе.


1

папки імпорту можна отримати, додавши такий вихідний код:

import sys
print sys.path

Прикладом автоматичного створення символічного посилання буде:

ln -s \`pip show em | grep "Location"| cut -d " " -f2\` \`python -m site --user-site\`

замість "em" ви можете використовувати інший пакет, який ви "щойно встановили, але python його не бачить"

нижче я поясню більш докладно, як це вимагається в коментарі.

припустимо, ви встановили модуль 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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.