Импортировать файл из подкаталога? - PullRequest
384 голосов
/ 11 августа 2009

У меня есть файл с именем 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 из подкаталога?

EDIT

Проблема была __init__.py, но не забудьте сослаться на BoxTime как lib.BoxTime или использовать:

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

Ответы [ 10 ]

468 голосов
/ 11 августа 2009

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

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

__init__.py

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

139 голосов
/ 11 августа 2009
  • Создать подкаталог с именем 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!
53 голосов
/ 21 февраля 2013

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

sys.path.insert(0, './lib')
import BoxTime
19 голосов
/ 11 августа 2009

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

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

17 голосов
/ 03 октября 2018

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

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

7 голосов
/ 08 февраля 2016

Я делаю это, что в основном охватывает все случаи (убедитесь, что у вас есть __init__.py в папке / 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()
3 голосов
/ 28 января 2018

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

from __future__ import absolute_import 

тогда

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

или лучше

from lib.BoxTime import bt_function
...
bt_function()
0 голосов
/ 16 марта 2018

/project/tester.py

/project/lib/BoxTime.py

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

/project/lib/somefolder/BoxTime.py

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

0 голосов
/ 28 сентября 2015

попробуйте это:

from lib import BoxTime

...