Подключение файла из подпапки?
У меня есть файл с именем tester.py
, который находится в каталоге /project
.
В /project
есть подкаталог с именем lib
, в котором находится файл BoxTime.py
:
/project/tester.py
/project/lib/BoxTime.py
Я хочу импортировать BoxTime
из tester
. Я попробовал следующее:
import lib.BoxTime
В результате возникла ошибка:
Traceback (most recent call last):
File "./tester.py", line 3, in <module>
import lib.BoxTime
ImportError: No module named lib.BoxTime
Есть идеи, как импортировать BoxTime
из подкаталога?
ИЗМЕНЕНИЕ
Проблема была в том, что отсутствовал файл __init__.py
, но не забудьте ссылаться на BoxTime
как lib.BoxTime
или используйте:
import lib.BoxTime as BT
...
BT.bt_function()
5 ответ(ов)
Чтобы создать структуру папок и файлов, следуйте этим шагам:
Создайте поддиректорию с именем
lib
:mkdir lib
Создайте пустой файл
lib/__init__.py
:touch lib/__init__.py
В файле
lib/BoxTime.py
напишите функциюfoo()
, как показано ниже:def foo(): print "foo!"
В вашем клиентском коде, находящемся в директории выше
lib
, напишите следующее:from lib import BoxTime BoxTime.foo()
Запустите ваш клиентский код, и вы получите следующий вывод:
foo!
Если вы работаете в Linux, то выполняйте команды следующим образом:
% cd ~/tmp
% mkdir lib
% touch lib/__init__.py
% cat > lib/BoxTime.py << EOF
def foo():
print "foo!"
EOF
% tree lib
lib
├── BoxTime.py
└── __init__.py
0 directories, 2 files
% python
Python 2.7.6 (default, Mar 22 2014, 22:59:56)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from lib import BoxTime
>>> BoxTime.foo()
foo!
Таким образом, вы создаете структуру пакета Python и можете использовать его в своем коде.
Вы можете попробовать добавить путь к вашей библиотеке в sys.path
:
import sys
sys.path.insert(0, './lib')
import BoxTime
Таким образом, Python будет искать модули сначала в указанной директории, и вы сможете успешно импортировать BoxTime
.
Вы не обязаны называть свою поддиректорию lib
. Вы можете использовать любое имя, если в этой директории будет файл __init__.py
.
Чтобы создать файл __init__.py
, выполните следующую команду в терминале Linux:
$ touch anything/__init__.py
Теперь у вас будет такая структура:
$ ls anything/
__init__.py
mylib.py
$ ls
main.py
Теперь вы можете импортировать mylib
в main.py
следующим образом:
from anything import mylib
mylib.myfun()
Вы также можете импортировать функции и классы следующим образом:
from anything.mylib import MyClass
from anything.mylib import myfun
instance = MyClass()
result = myfun()
Любую переменную, функцию или класс, которые вы поместите в __init__.py
, также можно будет использовать:
import anything
print(anything.myvar)
Или так:
from anything import myvar
print(myvar)
Да, ваш каталог lib
должен содержать файл __init__.py
, поскольку Python использует этот файл для определения, является ли директория модулем. Наличие __init__.py
позволяет Python понимать, что директория можно рассматривать как пакет, что позволяет импортировать модули из этой директории. Если в вашем каталоге lib
его нет, вы можете просто создать пустой файл с этим именем, чтобы Python распознавал данный каталог как пакет.
Вы можете использовать следующий пример для импорта файла из одного проекта в другой, убедившись, что у вас есть файл __init__.py
в папке, содержащей ваши библиотеки:
import sys, os
sys.path.append(os.path.dirname(os.path.realpath(__file__)) + "/relative/path/to/your/lib/folder")
import someFileNameWhichIsInTheFolder
...
somefile.foo()
Пример:
У вас есть в папке проекта:
/root/myproject/app.py
А в другой папке проекта:
/root/anotherproject/utils.py
/root/anotherproject/__init__.py
Вы хотите использовать /root/anotherproject/utils.py
и вызвать функцию foo
, которая в нем находится.
Тогда вам нужно написать в app.py
следующее:
import sys, os
sys.path.append(os.path.dirname(os.path.realpath(__file__)) + "/../anotherproject")
import utils
utils.foo()
Таким образом, вы сможете успешно импортировать и использовать функцию из другого проекта. Не забудьте удостовериться, что пути указаны правильно и папка содержит файл __init__.py
, чтобы Python распознал её как пакет.
Импорт файлов из другой папки
Как импортировать другие файлы Python?
Относительные импорты в Python 3
Импорт модуля по относительному пути
Использовать 'import module' или 'from module import'?