Як додати модуль Python до системи?


69

У мене така файлова структура:

Folder
   Common
      foo1.py
   TestFolder
      foo2.py

Я хочу імпортувати в foo2.py і foo1.py. Я спробував, але це не працює на Ubuntu:

sys.path.append(os.path.abspath('../../'))
from Common import foo1.py

У вас є __init__.pyфайл у вашій папці? саме так python створює пакети та дозволяє імпортувати модулі з цього пакету. guide.python-distribute.org/creation.html
Брайан

У мене є файл init.py у Загальних та в TestFolder
user284474,

вам це потрібно в каталозі папок, а також у підпапках, якщо ви хочете імпортувати
Брайан

Цей init .py порожній?
користувач284474

1
так, це може бути порожньо. Якщо вам не потрібна певна конфігурація для вашого пакета, але вам слід добре, щоб він був порожнім
Брайан,

Відповіді:


115

Як пітон знаходить свої модулі

Суворо сприйнятий, модуль - це єдиний файл python, тоді як пакет - це папка, що містить файли python, що супроводжується (може бути порожнім) файлом з ім'ям __init__.py, щоб сказати python, що це пакет для імпорту модулів з. В обох випадках модулі потребують їх .pyрозширення, але імпорт їх здійснюється без (див. Далі нижче).

За замовчуванням Python шукає свої модулі та пакети в $PYTHONPATH.

Щоб дізнатися, що включено в $ PYTHONPATH, запустіть наступний код у python (3):

import sys
print(sys.path)

Як додати каталог

Іноді

Зсередини файлу python ви можете періодично додавати шлях (ів) до шляху за замовчуванням, додаючи наступні рядки в головному розділі програми або сценарію python:

import sys
sys.path.insert(0, "/path/to/your/package_or_module")

Наприклад:

якщо у мене є папка:, /home/myname/pythonfilesі я хочу імпортувати файл module_1.py, розташований у цьому каталозі, я додаю це до головного розділу мого коду:

import sys
sys.path.insert(0, "/home/myname/pythonfiles")

І я можу просто імпортувати файл module_1.py:

import module_1

Коли я створюю пакет і хочу імпортувати модуль (и) з пакету, мені потрібно створити папку $PYTHONPATH, що містить модулі, що супроводжується (може бути порожнім) файлом під назвою__init__.py

Наприклад:

Для того, щоб імпортувати з пакета (папка) називається my_packageв /home/myname/pythonfiles, додайте /home/myname/pythonfilesшлях до вашого $PYTHONPATH, як і в прикладі 1, і імпортувати модуль з ім'ям module_2.py(в папці пакета) просто з: `

from <packagename> import module_2

$PYTHONPATHПостійне додавання каталогів :

Додайте у ~/.profileфайл наступний рядок .

export PYTHONPATH=$PYTHONPATH:/path/you/want/to/add

Підкаталоги

Зсередини пакету підкаталоги не включаються просто так; вам потрібно «ланцюжок» каталогів. Щоб імпортувати модуль module_3.py, всередині папки subfolderвсередині папки packagename:

import packagename.subfolder.module_3

Враховуючи той факт, що всі папки в пакет містять власний __init__.pyфайл.

Коли модуль знаходиться в тому ж каталозі, що і сценарій або додаток

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

Приклад:

Якщо у мене є папка, що містить script.pyі module.pyя можу просто імпортувати модуль:

import module

Я також хотів би запропонувати прочитати python.org/dev/peps/pep-0328 , особливо якщо ви орієнтуєтесь на Python 3 (або плануєте націлити на майбутнє)
zaadeh

Чому printenv PYTHONPATHнічого?
Стіві Г

1
sys.path.append("/path/to/your/package_or_module")також додає шлях до замовчування, і він менш заплутаний. У порівнянні з тим, sys.path.insert(0,...)що є 0в якості першого аргументу.
Пол Рудьо

1
@PaulRougieux: Проблема з додаванням до шляху полягає в тому, що ваш модуль може вже існувати в іншому місці шляху (наприклад, у файлі .egg), і ви підберете цю версію свого модуля замість тієї у вашому файлі.
snark

6

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

from ..Common import foo1

А також вам потрібна __init__.pyу всіх ваших папках.


1
Дякую. Але якщо у мене є модуль, який складається з двох папок вгору, як я імпортую це? від .... Папка не працює
користувач284474

Це працює з єдиним рівнем?
Сільвен Пано

З єдиним рівнем це працює.
користувач284474

добре, чи можете ви прийняти цю відповідь? для багаторівневих, хоча ви можете задати інше запитання, але спочатку погляньте на це питання і цю відповідь, щоб найкращим чином зателефонувати до своїх модулів всередині пакету
Sylvain Pineau,

Це правда для Python 2 або Python 3? Або обоє?
alex

2

Примітка: Ця відповідь застаріла для останньої версії python 3, але тут для більш ранньої версії. Для отримання додаткової інформації читайте коментарі та https://www.python.org/dev/peps/pep-0420/


По суті, кожна папка з кодом python, яку ви хочете додати до системи, потребує файлу __init__.py. Ці файли __init__.py можуть бути порожніми.


Як я розумію, це вже не так, каталог зараз стає "простором імен".
Аарон Холл

@AaronHall цікаво, джерело?
don.joey

1
Спробуйте це для підтвердження: python -c "from pathlib import Path; Path('ns').mkdir(); Path('ns/mod.py').write_text('''print('mod.py')'''); import ns.mod; from shutil import rmtree; rmtree('ns')"також ось деяка відповідна документація, PEP 420, де описано доповнення семантики пакету простору імен
Aaron Hall
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.