Ответ 1
Взгляните на документацию пакетов (раздел 6.4) здесь: http://docs.python.org/tutorial/modules.html
Короче говоря, вам нужно поместить пустой файл с именем
__init__.py
в каталоге "lib".
У меня есть файл с именем 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 содержится файл __init__.py
?
Python использует __init__.py
, чтобы определить, является ли каталог модулем.
Попробуйте import .lib.BoxTime
. Подробнее читайте об относительном импорте в PEP 328.
Я делаю это, что в основном охватывает все случаи (убедитесь, что у вас есть __init__.py
в папке relative/path/to/your/lib/):
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()
Я записываю это, потому что каждый, кажется, предлагает вам создать каталог 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)
попробуйте следующее:
from lib import BoxTime
Если вы используете Ipython и jupyter, то вам может потребоваться просто перезапустить ядро, чтобы оно распознало вновь добавленный каталог.
/project/tester.py
/project/lib/BoxTime.py
создайте пустой файл __init__.py
до строки, пока не достигнете файла
/project/lib/somefolder/BoxTime.py
#lib
- needs имеет два элемента: один __init__.py
и каталог с именем somefolder #somefolder
имеет два элемента: boxtime.py
и __init__.py