Non riesco a importare i miei moduli in Python


141

Sto facendo fatica a capire come funziona l'importazione dei moduli in Python (non l'ho mai fatto prima in nessun altro linguaggio).

Diciamo che ho:

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

Ora sto cercando di ottenere qualcosa del genere:

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

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

Tuttavia, sto sicuramente facendo qualcosa di sbagliato in quanto Python non può vedere che myappè un modulo:

ImportError: No module named myapp

Risposte:


96

Nel tuo caso particolare sembra che tu stia provando a importare SomeObjectdagli script myapp.py e TestCase.py. Da myapp.py, fallo

import SomeObject

poiché è nella stessa cartella. Per TestCase.py, fare

from ..myapp import SomeObject

Tuttavia , questo funzionerà solo se si importa TestCase dal pacchetto. Se vuoi eseguire direttamente python TestCase.py, dovresti fare confusione con il tuo percorso. Questo può essere fatto in Python:

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

sebbene ciò non sia generalmente raccomandato.

In generale, se si desidera che altre persone utilizzino il pacchetto Python, è necessario utilizzare distutils per creare uno script di installazione. In questo modo, chiunque può installare facilmente il tuo pacchetto usando un comando simile python setup.py installe sarà disponibile ovunque sul proprio computer. Se prendi sul serio il pacchetto, potresti persino aggiungerlo all'indice del pacchetto Python, PyPI .


Ho provato semplicemente a utilizzare importnel mio TestCase.pyma mi ha comunque dato lo stesso errore. Suppongo sia perché si trova in una sottodirectory del __init__.py?
n0pe

Oh aspetta, penso di averlo capito. Se i miei casi di test chiamano dal pacchetto, sarò in grado di usare il from ... import ...giusto?
n0pe

1
Lo farai solo se TestCase viene importato dall'esterno del pacchetto, ad esempio, se from myapp.tests import TestCase from a script outside myapp. If you're running eseguo python TestCase.py` all'interno della cartella test, non puoi effettuare importazioni relative
David Robinson,

1
Ho eseguito "pip install -e." Per installare myapp, ma quando provo ad eseguire TestCase nel codice di Visual Studio ricevo ancora "ImportError: nessun modulo chiamato myapp". ma se eseguo "python" e poi in python eseguo "da myapp import SomeObject" funziona. Che cosa sto facendo di sbagliato?
Dagrun,

@DavidRobinson Ho usato il metodo che hai menzionato, che non ha mostrato alcun errore dopo l'esecuzione from fodername import file_name_of_my_py_code, ma quando ho provato ad accedere all'oggetto definito in file_name_of_my_py_code.pyesso diceNameError: name 'ClassName' is not defined
Kavin Raju S

44

La funzione importcerca i file nel tuo ambiente PYTHONPATH. variabile e la tua directory locale. Quindi puoi mettere tutti i tuoi file nella stessa directory o esportare il percorso digitando in un terminale ::

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

2
Quindi come posso assicurarmi che funzioni per tutti gli altri che lo userebbero? Preferirei non dover dire loro di impostare determinate variabili d'ambiente prima di eseguirlo.
n0pe

1
la directory corrente è in pythonpath, quindi finché gli script sono nella stessa cartella / directory dovrebbe funzionare. sfortunatamente ciascuno di questi script si trova in directory separate.
JKirchartz,

4
Per gli utenti Windows, invece di export"impostare PYTHONPATH =% PYTHONPATH%; C: \ path_to_myapp \ myapp \ myapp \"
loved.by.Jesus

Nel codice vs sono stato in grado di risolvere questo problema aggiungendo la variabile Env di PYTHONPATH al mio launch.json: "env": {"PYTHONPATH": "$ {workspaceFolder}"}
Michael Armitage,

11

il percorso di esportazione è un buon modo. Un altro modo è aggiungere un .pth alla posizione dei pacchetti del sito. Sul mio Mac my Python mantiene i pacchetti del sito in / Library / Python mostrati di seguito

/Library/Python/2.7/site-packages

Ho creato un file chiamato awesome.pth in /Library/Python/2.7/site-packages/awesome.pth e nel file ho inserito il seguente percorso che fa riferimento ai miei fantastici moduli

/opt/awesome/custom_python_modules

1
nel caso in cui sto lavorando su Windows come
posso

Non ne sono sicuro. Nel caso in cui si stia utilizzando Windows. Trova un software VM e usa Linux. Oppure - vedi questa risposta sull'esportazione di variabili in Windows. stackoverflow.com/questions/559816/...
jmontross

questo è esattamente ciò di cui avevo bisogno
Lee88,

1
Felice di sapere che @ Lee88 - mi ci è voluto un po 'per capirlo da solo :)
jmontross,

9

Puoi provare

from myapp.myapp import SomeObject

perché il nome del tuo progetto è lo stesso di myapp.py che lo fa prima cercare nel documento di progetto


3

Nella tua prima directory myapp, puoi aggiungere un file setup.py e aggiungere due codici Python in setup.py

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

nella tua prima directory myapp nella riga di comando, usa pip install -e. per installare il pacchetto


2

pip installsu Windows 10 per impostazione predefinita l'installazione in "Programmi / PythonXX / Lib / site-pacchetti" è una directory che richiede privilegi di amministratore. Quindi ho risolto il mio problema eseguendo pip install come amministratore (devi aprire il prompt dei comandi come amministratore anche se hai effettuato l'accesso con un account amministratore). Inoltre, è più sicuro chiamare pip da Python.
ad es.
python -m pip install <package-name>
invece di
pip install <package-name>


0

Nel mio caso è stata una sorpresa tra Windows e Python, nonostante i nomi dei file di Windows non facciano distinzione tra maiuscole e minuscole, l'importazione Python lo è. Quindi se hai un Stuff.pyfile devi importare questo nome così com'è.


0

Devi avere

__init__.py

in tutte le cartelle che hanno il codice con cui devi interagire. È inoltre necessario specificare il nome della cartella principale del progetto in ogni importazione anche se il file che si è tentato di importare è allo stesso livello.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.