Ich kann meine eigenen Module nicht in Python importieren


140

Es fällt mir schwer zu verstehen, wie der Modulimport in Python funktioniert (ich habe es auch noch nie in einer anderen Sprache gemacht).

Nehmen wir an, ich habe:

myapp/__init__.py
myapp/myapp/myapp.py
myapp/myapp/SomeObject.py
myapp/tests/TestCase.py

Jetzt versuche ich so etwas zu bekommen:

myapp.py
===================
from myapp import SomeObject
# stuff ...

TestCase.py
===================
from myapp import SomeObject
# some tests on SomeObject

Ich mache jedoch definitiv etwas falsch, da Python nicht sehen kann, dass myappes sich um ein Modul handelt:

ImportError: No module named myapp

Antworten:


95

In Ihrem speziellen Fall SomeObjectscheint es, als würden Sie versuchen, aus den Skripten myapp.py und TestCase.py zu importieren . Von myapp.py aus tun

import SomeObject

da es sich im selben Ordner befindet. Führen Sie für TestCase.py Folgendes aus

from ..myapp import SomeObject

Dies funktioniert jedoch nur, wenn Sie TestCase aus dem Paket importieren. Wenn Sie direkt laufen möchten python TestCase.py, müssten Sie sich mit Ihrem Pfad herumschlagen. Dies kann in Python erfolgen:

import sys
sys.path.append("..")
from myapp import SomeObject

Dies wird jedoch im Allgemeinen nicht empfohlen.

Wenn Sie möchten, dass andere Benutzer Ihr Python-Paket verwenden, sollten Sie im Allgemeinen distutils verwenden , um ein Setup-Skript zu erstellen. Auf diese Weise kann jeder Ihr Paket einfach mit einem Befehl wie installieren python setup.py installund es wird überall auf seinem Computer verfügbar sein. Wenn Sie das Paket ernst nehmen, können Sie es sogar dem Python- Paketindex PyPI hinzufügen .


Ich habe versucht, einfach importin meinem zu verwenden, TestCase.pyaber es gab mir immer noch den gleichen Fehler. Ich nehme an, es liegt daran, dass es sich in einem Unterverzeichnis des __init__.py?
n0pe

Oh, warte, ich glaube ich verstehe. Wenn meine Testfälle aus dem Paket aufrufen, kann ich das from ... import ...richtige verwenden?
n0pe

1
Dies ist nur möglich, wenn TestCase von außerhalb des Pakets importiert wird. Wenn ich beispielsweise from myapp.tests import TestCase from a script outside myapp. If you're running python TestCase.py` im Testordner ausführe, können Sie keine relativen Importe durchführen
David Robinson

1
Ich habe "pip install -e." Ausgeführt, um myapp zu installieren, aber wenn ich versuche, TestCase in Visual Studio-Code auszuführen, wird immer noch "ImportError: Kein Modul namens myapp" angezeigt. aber wenn ich "python" ausführe und dann in python "from myapp import SomeObject" ausführe, funktioniert es. Was mache ich falsch?
Dagrun

@DavidRobinson Ich habe die von Ihnen erwähnte Methode verwendet, die nach der Ausführung keinen Fehler zeigte from fodername import file_name_of_my_py_code, aber als ich versuchte, auf das darin definierte Objekt zuzugreifen file_name_of_my_py_code.py, heißt esNameError: name 'ClassName' is not defined
Kavin Raju S

43

Die Funktion importsucht nach Dateien in Ihrer PYTHONPATH-Umgebung. Variable und Ihr lokales Verzeichnis. Sie können also entweder alle Ihre Dateien im selben Verzeichnis ablegen oder den eingegebenen Pfad in ein Terminal exportieren ::

export PYTHONPATH="$PYTHONPATH:/path_to_myapp/myapp/myapp/"

2
Wie kann ich dann sicherstellen, dass es für alle anderen funktioniert, die es verwenden würden? Ich möchte ihnen lieber nicht sagen, dass sie bestimmte Umgebungsvariablen festlegen sollen, bevor sie ausgeführt werden.
n0pe

1
Das aktuelle Verzeichnis befindet sich in Pythonpath. Solange sich die Skripte im selben Ordner / Verzeichnis befinden, sollte es funktionieren. Leider befindet sich jedes dieser Skripte in separaten Verzeichnissen.
JKirchartz

4
Für Windows - Benutzer, statt exportwir haben "Set PYTHONPATH =% PYTHONPATH%; C: \ path_to_myapp \ myapp \ myapp \"
loved.by.Jesus

In vs Code konnte ich dies beheben, indem ich PYTHONPATH Env Variable zu meiner launch.json hinzufügte: "env": {"PYTHONPATH": "$ {workspaceFolder}"}
Michael Armitage

11

Pfad exportieren ist ein guter Weg. Eine andere Möglichkeit besteht darin, Ihrem Standort für Site-Pakete eine .pth hinzuzufügen. Auf meinem Mac speichert mein Python die unten gezeigten Site-Pakete in / Library / Python

/Library/Python/2.7/site-packages

Ich habe eine Datei mit dem Namen awesome.pth unter /Library/Python/2.7/site-packages/awesome.pth erstellt und in die Datei den folgenden Pfad eingefügt, der auf meine fantastischen Module verweist

/opt/awesome/custom_python_modules

1
in dem Fall, dass ich in Windows arbeite, wie mache ich das
Nwawel A Iroume

Ich bin mir nicht sicher. Für den Fall, dass Sie Windows verwenden. Finden Sie eine VM-Software und verwenden Sie Linux. Oder - siehe diese Antwort zum Exportieren von Variablen in Windows. stackoverflow.com/questions/559816/…
jmontross

Das ist genau das, was ich brauchte
Lee88

1
Freut mich zu hören, dass @ Lee88 - ich habe eine Weile gebraucht, um es selbst herauszufinden :)
jmontross

9

Du kannst es versuchen

from myapp.myapp import SomeObject

weil Ihr Projektname mit myapp.py identisch ist, wodurch zuerst das Projektdokument durchsucht wird


3

In Ihrem ersten myapp-Verzeichnis können Sie eine setup.py-Datei hinzufügen und zwei Python-Codes in setup.py hinzufügen

from setuptools import setup
setup(name='myapp')

Verwenden Sie in Ihrem ersten myapp-Verzeichnis in der Befehlszeile pip install -e. um das Paket zu installieren


2

pip installUnter Windows 10 wird standardmäßig in "Programme / PythonXX / Lib / Site-Pakete" installiert. Dies ist ein Verzeichnis, für das Administratorrechte erforderlich sind. Daher habe ich mein Problem behoben, indem ich pip install als Administrator ausgeführt habe (Sie müssen die Eingabeaufforderung als Administrator öffnen, auch wenn Sie mit einem Administratorkonto angemeldet sind). Es ist auch sicherer, pip von Python aus aufzurufen.
zB
python -m pip install <package-name>
statt
pip install <package-name>


0

In meinem Fall war es eine Überraschung zwischen Windows und Python, obwohl Windows-Dateinamen nicht zwischen Groß- und Kleinschreibung unterscheiden, ist der Python-Import. Wenn Sie also eine Stuff.pyDatei haben, müssen Sie diesen Namen unverändert importieren.


0

Du brauchst

__init__.py

In allen Ordnern mit Code, mit denen Sie interagieren müssen. Sie müssen bei jedem Import den Namen des obersten Ordners Ihres Projekts angeben, auch wenn sich die zu importierende Datei auf derselben Ebene befindet.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.