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()
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".
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!
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
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.
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 .
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()
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()
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
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()
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
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