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


Answers

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

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



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

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




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



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

from lib import BoxTime