2017-11-13 7 views
2

Ich habe einige Zeit damit verbracht, dies zu erforschen, und ich kann einfach nicht in meinem Kopf ausarbeiten.Python-Modul importieren mit sys.path und os.path Problem

betreibe ich ein Programm in einem eigenen Verzeichnis home/Programm/core/main.py

In main.py Ich versuche, und importieren Sie ein Modul namens my_module.py das ist in einem anderen Verzeichnis befindet, sagen home/Programm /modules/my_module.py

In main.py das ist, wie ich an sys.path anhängen, so dass das Programm auf jedem Rechner (hoffentlich) ausgeführt werden kann.

import os.path 
import sys 

# This should give the path to home/program 
sys.path.append(os.path.join(os.path.abspath(os.path.dirname(__file__), '..')) 
# Which it does when checking with 
print os.path.join(os.path.abspath(os.path.dirname(__file__), '..') 

# So now sys.path knows the location of where modules directory is, it should work right? 

import modules.my_module # <----RAISES ImportError WHY? 

Allerdings, wenn ich einfach tun:

sys.path.append('home/program/modules') 
import my_module 

Alles funktioniert gut. Aber das ist nicht ideal, da es jetzt darauf ankommt, dass das Programm unter home/program existieren muss.

Antwort

1

das ist, weil modules kein gültiges Python-Paket ist, wahrscheinlich, weil es keine __init__.py Datei enthält (Sie nicht Traverse Verzeichnisse mit import ohne sie mit __init__.py markiert werden)

hinzufügen Also entweder ein leeres __init__.py Datei oder den Pfad summieren sich zu modules so Ihre erste Schnipsel entspricht dem zweiten:

sys.path.append(os.path.join(os.path.abspath(os.path.dirname(__file__), '..','modules')) 
import my_module 

beachten Sie, dass Sie auch die importieren Modul, indem Sie den vollständigen Pfad zu ihm, mit erweiterten Importfunktionen: How to import a module given the full path?

+0

Aber das ist mein Problem, warum sollte ich sinnlose __init__.py Datei ?? Ich möchte nur das Verzeichnis, in dem my_module.py sauber ist, my_module.py ist eigentlich die einzige Datei in diesem Verzeichnis. Warum funktioniert 'sys.path.append ('home/programs/modules')' ohne die '__init __. Py' Datei –

+0

weil das wie Python funktioniert. Sie können Verzeichnisse nicht mit 'import' durchqueren, ohne dass sie mit' _init__py' markiert sind, es ist nicht sinnlos. Sie haben immer noch die zweite Lösung: den Pfad zu "Modulen" anhängen. –

+0

ok, aber wie in der Welt implementiere ich einen Code, wo ich ein Modul importieren kann, so dass das Programm in dem Verzeichnis funktioniert, in dem der Benutzer es ohne __init__.py –