it-swarm.com.de

Eine Datei aus einem Unterverzeichnis importieren?

Ich habe eine Datei mit dem Namen tester.py, die sich auf /project befindet.

/project hat ein Unterverzeichnis namens lib mit einer Datei namens BoxTime.py:

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

Ich möchte BoxTime aus tester importieren. Ich habe das versucht:

import lib.BoxTime

Welches resultierte:

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

Irgendwelche Ideen, wie man BoxTime aus dem Unterverzeichnis importiert?

EDIT

Der __init__.py war das Problem, aber vergessen Sie nicht, BoxTime als lib.BoxTime zu bezeichnen, oder verwenden Sie:

import lib.BoxTime as BT
...
BT.bt_function()
397
Adam Matan

Sehen Sie sich hier die Dokumentation zu Packages (Abschnitt 6.4) an: http://docs.python.org/tutorial/modules.html

Kurz gesagt, Sie müssen eine leere Datei mit dem Namen einfügen

__init__.py

im "lib" -Verzeichnis.

484
Greg
  • Erstellen Sie ein Unterverzeichnis mit dem Namen lib.
  • Erstellen Sie eine leere Datei mit dem Namen lib\__init__.py.
  • Schreiben Sie in lib\BoxTime.py eine Funktion foo() wie folgt:

    def foo():
        print "foo!"
    
  • Schreiben Sie in Ihren Client-Code im Verzeichnis über lib:

    from lib import BoxTime
    BoxTime.foo()
    
  • Führen Sie Ihren Clientcode aus. Sie erhalten:

    foo!
    

Viel später - unter Linux würde es so aussehen:

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

Sie können versuchen, es in sys.path einzufügen:

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

Ich schreibe dies auf, weil jeder zu empfehlen scheint, ein lib -Verzeichnis zu erstellen.

Sie müssen Ihr Unterverzeichnis nicht lib nennen. Sie können es anything nennen, vorausgesetzt, Sie geben einen __init__.py ein.

Sie können dies tun, indem Sie den folgenden Befehl in eine Linux-Shell eingeben:

$ touch anything/__init__.py 

Nun haben Sie diese Struktur:

$ ls anything/
__init__.py
mylib.py

$ ls
main.py

Dann können Sie mylib wie folgt in main.py importieren:

from anything import mylib 

mylib.myfun()

Sie können auch Funktionen und Klassen wie folgt importieren:

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

instance = MyClass()
result = myfun()

Auf jede variable Funktion oder Klasse, die Sie in __init__.py einfügen, kann ebenfalls zugegriffen werden:

import anything

print(anything.myvar)

Oder so:

from anything import myvar

print(myvar)
20
nurettin

Enthält Ihr lib-Verzeichnis eine __init__.py -Datei?

Python verwendet __init__.py, um festzustellen, ob ein Verzeichnis ein Modul ist.

19
Wade

Versuchen Sie import .lib.BoxTime. Weitere Informationen zum relativen Import finden Sie in PEP 328 .

15
drrlvn

Ich mache das, was grundsätzlich alle Fälle abdeckt (stelle sicher, dass du __init__.py im relativen Verzeichnis/path/to/your/lib/hast):

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


Beispiel:
Sie haben in Ihrem Projektordner:

/root/myproject/app.py

Sie haben in einem anderen Projektordner:

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

Sie möchten /root/anotherproject/utils.py verwenden und die darin enthaltene Funktion foo aufrufen.

So schreiben Sie in app.py:

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

utils.foo()
7
Mercury

Erstellen Sie eine leere Datei __init__.py im Unterverzeichnis/lib. Und füge am Anfang des Hauptcodes hinzu

from __future__ import absolute_import 

dann

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

oder besser

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

versuche dies:

from lib import BoxTime

0
Orane