6

Подключение файла из подпапки?

7

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

2

Чтобы создать структуру папок и файлов, следуйте этим шагам:

  1. Создайте поддиректорию с именем lib:

    mkdir lib
    
  2. Создайте пустой файл lib/__init__.py:

    touch lib/__init__.py
    
  3. В файле lib/BoxTime.py напишите функцию foo(), как показано ниже:

    def foo():
        print "foo!"
    
  4. В вашем клиентском коде, находящемся в директории выше lib, напишите следующее:

    from lib import BoxTime
    BoxTime.foo()
    
  5. Запустите ваш клиентский код, и вы получите следующий вывод:

    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 и можете использовать его в своем коде.

1

Вы можете попробовать добавить путь к вашей библиотеке в sys.path:

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

Таким образом, Python будет искать модули сначала в указанной директории, и вы сможете успешно импортировать BoxTime.

0

Вы не обязаны называть свою поддиректорию 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)
0

Да, ваш каталог lib должен содержать файл __init__.py, поскольку Python использует этот файл для определения, является ли директория модулем. Наличие __init__.py позволяет Python понимать, что директория можно рассматривать как пакет, что позволяет импортировать модули из этой директории. Если в вашем каталоге lib его нет, вы можете просто создать пустой файл с этим именем, чтобы Python распознавал данный каталог как пакет.

0

Вы можете использовать следующий пример для импорта файла из одного проекта в другой, убедившись, что у вас есть файл __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 распознал её как пакет.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь