Zaimportować plik z podkatalogu?

Mam plik o nazwie tester.py, znajdujący się na /project.

/project posiada podkatalog o nazwie lib, z plikiem o nazwie BoxTime.py:

/project/tester.py
/project/lib/BoxTime.py

Chcę zaimportować BoxTime z tester. Próbowałem tego:

import lib.BoxTime

Co zaowocowało:

Traceback (most recent call last):
  File "./tester.py", line 3, in <module>
    import lib.BoxTime
ImportError: No module named lib.BoxTime

Jakieś pomysły jak zaimportować BoxTime z podkatalogu?

EDIT

__init__.py był problemem, ale nie zapomnij odnieść się do BoxTime jako lib.BoxTime, lub użyć:

import lib.BoxTime as BT
...
BT.bt_function()
Author: martineau, 2009-08-11

10 answers

Spójrz na dokumentację pakietów (sekcja 6.4) tutaj: http://docs.python.org/tutorial/modules.html

W skrócie, musisz umieścić pusty plik o nazwie

__init__.py

W katalogu "lib".

 409
Author: Greg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-11 14:46:29
  • Utwórz podkatalog o nazwie lib.
  • Utwórz pusty plik o nazwie lib\__init__.py.
  • W lib\BoxTime.py napisz funkcję foo() Tak:

    def foo():
        print "foo!"
    
  • W kodzie klienta w katalogu powyżej lib napisz:

    from lib import BoxTime
    BoxTime.foo()
    
  • Uruchom kod klienta. Otrzymasz:

    foo!
    

Znacznie później -- w Linuksie wyglądałoby to tak:

% 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!
 124
Author: hughdbrown,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-22 12:01:28

Możesz spróbować wstawić go w sys.path:

sys.path.insert(0, './lib')
import BoxTime
 40
Author: Kresimir,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-21 09:47:42

Czy twój katalog lib zawiera plik __init__.py?

Python używa __init__.py do określenia, czy katalog jest modułem.

 19
Author: Wade,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-11 14:44:44

Spróbuj import .lib.BoxTime. Aby uzyskać więcej informacji, przeczytaj o względnym imporcie w PEP 328 .

 12
Author: drrlvn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-11 14:48:53

Robię to, co zasadniczo obejmuje wszystkie przypadki (upewnij się, że masz __init__.py w względnym/path/to/your/lib / folder):

import sys, os
sys.path.append(os.path.dirname(os.path.realpath(__file__)) + "/relative/path/to/your/lib/folder")
import someFileNameWhichIsInTheFolder
...
somefile.foo()


przykład:
Masz w folderze projektu:

/root/myproject/app.py

Masz w innym folderze projektu:

/root/anotherproject/utils.py
/root/anotherproject/__init__.py

Chcesz użyć /root/anotherproject/utils.py i wywołać funkcję foo, która w niej jest.

Więc piszesz w app.py:

import sys, os
sys.path.append(os.path.dirname(os.path.realpath(__file__)) + "/../anotherproject")
import utils

utils.foo()
 6
Author: Mercury,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-05 12:56:26

Utwórz pusty plik __init__.py w podkatalogu / lib. I dodać na początku głównego kodu

from __future__ import absolute_import 

Then

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

Lub lepiej

from lib.BoxTime import bt_function
...
bt_function()
 3
Author: Mik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-28 20:58:28

Spróbuj tego:

from lib import BoxTime

 0
Author: Orane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-28 20:53:28

Zapisuję to, ponieważ wszyscy sugerują, że musisz utworzyć lib katalog.

Nie musisz nazywać swojego podkatalogu lib. Możesz go nazwać anything pod warunkiem, że umieścisz w nim __init__.py.

Możesz to zrobić, wpisując następujące polecenie w powłoce Linuksa:

$ touch anything/__init__.py 

Więc teraz masz taką strukturę:

$ ls anything/
__init__.py
mylib.py

$ ls
main.py

Następnie możesz zaimportować mylib do main.py w następujący sposób:

from anything import mylib 

I możesz używać swoich funkcji jak to:

mylib.myfun()
 0
Author: nurettin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-03 14:11:35

/project/tester.py

/project/lib/BoxTime.py

Utwórz pusty plik __init__.py w dół linii, aż dotrzesz do pliku

/project/lib/somefolder/BoxTime.py

#lib -- needs ma dwie pozycje jeden __init__.py i katalog o nazwie somefolder #somefolder posiada dwie pozycje boxtime.py i __init__.py

 -1
Author: Chaitanya Gk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-17 07:40:10