Импортировать файл из подкаталога?

У меня есть файл с именем 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()

Ответ 1

Взгляните на документацию пакетов (раздел 6.4) здесь: http://docs.python.org/tutorial/modules.html

Короче говоря, вам нужно поместить пустой файл с именем

__init__.py

в каталоге "lib".

Ответ 2

  • Создайте подкаталог с именем 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!

Ответ 3

Вы можете попробовать вставить его в sys.path:

sys.path.insert(0, './lib')
import BoxTime

Ответ 4

В вашем каталоге lib содержится файл __init__.py?

Python использует __init__.py, чтобы определить, является ли каталог модулем.

Ответ 5

Попробуйте import .lib.BoxTime. Подробнее читайте об относительном импорте в PEP 328.

Ответ 6

Я делаю это, что в основном охватывает все случаи (убедитесь, что у вас есть __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()

Ответ 7

Создайте пустой файл __init__.py в подкаталоге /lib. И добавьте в начале основного кода

from __future__ import absolute_import 

затем

import lib.BoxTime as BT
...
BT.bt_function()

или лучше

from lib.BoxTime import bt_function
...
bt_function()

Ответ 8

Я записываю это, потому что каждый, кажется, предлагает вам создать каталог 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)

Ответ 9

попробуйте следующее:

from lib import BoxTime

Ответ 10

Если вы используете Ipython и jupyter, то вам может потребоваться просто перезапустить ядро, чтобы оно распознало вновь добавленный каталог.

Ответ 11

/project/tester.py

/project/lib/BoxTime.py

создайте пустой файл __init__.py до строки, пока не достигнете файла

/project/lib/somefolder/BoxTime.py

#lib - needs имеет два элемента: один __init__.py и каталог с именем somefolder #somefolder имеет два элемента: boxtime.py и __init__.py