У мене така файлова структура:
Folder
Common
foo1.py
TestFolder
foo2.py
Я хочу імпортувати в foo2.py
і foo1.py
. Я спробував, але це не працює на Ubuntu:
sys.path.append(os.path.abspath('../../'))
from Common import foo1.py
У мене така файлова структура:
Folder
Common
foo1.py
TestFolder
foo2.py
Я хочу імпортувати в foo2.py
і foo1.py
. Я спробував, але це не працює на Ubuntu:
sys.path.append(os.path.abspath('../../'))
from Common import foo1.py
Відповіді:
Як пітон знаходить свої модулі
Суворо сприйнятий, модуль - це єдиний файл 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
printenv PYTHONPATH
нічого?
sys.path.append("/path/to/your/package_or_module")
також додає шлях до замовчування, і він менш заплутаний. У порівнянні з тим, sys.path.insert(0,...)
що є 0
в якості першого аргументу.
Правильний спосіб використання відносного імпорту:
from ..Common import foo1
А також вам потрібна __init__.py
у всіх ваших папках.
Примітка: Ця відповідь застаріла для останньої версії python 3, але тут для більш ранньої версії. Для отримання додаткової інформації читайте коментарі та https://www.python.org/dev/peps/pep-0420/
По суті, кожна папка з кодом python, яку ви хочете додати до системи, потребує файлу __init__.py. Ці файли __init__.py можуть бути порожніми.
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, де описано доповнення семантики пакету простору імен
__init__.py
файл у вашій папці? саме так python створює пакети та дозволяє імпортувати модулі з цього пакету. guide.python-distribute.org/creation.html