Импортировать файл из подкаталога?
-
12-09-2019 - |
Вопрос
У меня есть файл под названием 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()
Решение
Ознакомьтесь с документацией по пакетам (раздел 6.4) здесь: http://docs.python.org/tutorial/modules.html
Короче говоря, вам нужно поместить пустой файл с именем
__init__.py
в каталоге "lib".
Другие советы
- Создайте подкаталог с именем
lib
. - Создайте пустой файл с именем
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
heredoc> def foo():
heredoc> print "foo!"
heredoc> 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!
Вы можете попробовать вставить его в sys.path
:
sys.path.insert(0, './lib')
import BoxTime
Я записываю это, потому что все, кажется, предполагают, что вы должны создать lib
справочник.
Вам не нужно указывать имя своего подкаталога lib
.Вы можете назвать это anything
при условии, что вы поставите __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
чтобы определить, является ли каталог модулем.
Попробуй import .lib.BoxTime
.Для получения дополнительной информации прочитайте об относительном импорте в БОДРОСТЬ ДУХА 328.
Я делаю это, которое в основном охватывает все случаи (убедитесь, что у вас есть __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
в подкаталоге /lib.И добавьте в начале основного кода
from __future__ import absolute_import
тогда
import lib.BoxTime as BT
...
BT.bt_function()
или лучше
from lib.BoxTime import bt_function
...
bt_function()
попробуй это:
from lib import BoxTime
/project/tester.py
/project/lib/BoxTime.py
создать пустой файл __init__.py
двигайтесь дальше, пока не дойдете до файла
/project/lib/somefolder/BoxTime.py
#lib
-- потребности состоят из двух пунктов в одном __init__.py
и каталог с именем somefolder
#somefolder
имеет два элемента boxtime.py
и __init__.py