Domanda

Ho un file chiamato tester.py, situato sulla /project.

/project ha una sottodirectory chiamata lib, con un file chiamato BoxTime.py:

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

Voglio importare BoxTime da tester. Ho provato questo:

import lib.BoxTime

che ha portato:

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

Tutte le idee su come importare BoxTime dalla sottodirectory?

Modifica

Il __init__.py era il problema, ma non dimenticate di fare riferimento a BoxTime come lib.BoxTime, o l'uso:

import lib.BoxTime as BT
...
BT.bt_function()
È stato utile?

Soluzione

Date un'occhiata alla documentazione di pacchetti (paragrafo 6.4) qui: http: //docs.python .org / tutorial / modules.html

In breve, è necessario mettere un file vuoto denominato

__init__.py

nella directory "lib".

Altri suggerimenti

  • Creare una sottodirectory lib.
  • Crea un file vuoto di nome lib\__init__.py.
  • In lib\BoxTime.py, scrivere una funzione foo() come questo:

    def foo():
        print "foo!"
    
  • Nel codice cliente nella directory sopra lib, scrivere:

    from lib import BoxTime
    BoxTime.foo()
    
  • Eseguire il codice client. Otterrete:

    foo!
    

Molto più tardi - in linux, sarebbe simile a questa:

% 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!

Si può provare inserendola in sys.path:

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

sto scrivendo questo giù perché tutti sembrano suggerire che è necessario creare una directory lib.

Non è necessario assegnare un nome al lib sub-directory. È possibile assegnare un nome che anything fornito si mette un __init__.py in esso.

Si può fare inserendo il seguente comando in una shell linux:

$ touch anything/__init__.py 

Così ora avete questa struttura:

$ ls anything/
__init__.py
mylib.py

$ ls
main.py

Quindi è possibile importare in mylib main.py in questo modo:

from anything import mylib 

mylib.myfun()

Puoi anche funzioni di importazione e classi come questo:

from anything.mylib import MyClass
from anything.mylib import myfun

instance = MyClass()
result = myfun()

Ogni funzione variabile o classe che si svolge all'interno di __init__.py si può accedere anche:

import anything

print(anything.myvar)

O come questa:

from anything import myvar

print(myvar)

La vostra directory lib contiene un file __init__.py?

Python usa __init__.py per determinare se una directory è un modulo.

Prova import .lib.BoxTime. Per ulteriori informazioni leggere l'importazione relativa a PEP 328 .

Lo faccio che copre praticamente tutti i casi (assicuratevi di avere __init__.py in relativa / path / to / file / lib / cartella):

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


Esempio:
Avete nella cartella del progetto:

/root/myproject/app.py

Hai in un'altra cartella di progetto:

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

Si desidera utilizzare /root/anotherproject/utils.py e chiamare la funzione foo, che è in esso.

Quindi, si scrive in app.py:

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

utils.foo()

Crea un file vuoto __init__.py nella sottodirectory / lib. E aggiungere al inizio del codice principale

from __future__ import absolute_import 

poi

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

o meglio

from lib.BoxTime import bt_function
...
bt_function()

provare questo:

from lib import BoxTime

/project/tester.py

/project/lib/BoxTime.py

creare il file __init__.py vuoto lungo la linea fino a raggiungere il file

/project/lib/somefolder/BoxTime.py

#lib - esigenze ha due elementi uno __init__.py e una directory chiamata somefolder #somefolder ha due elementi boxtime.py e __init__.py

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top