Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top