Domanda

Python è installato in una directory locale.

Il mio albero di directory è simile al seguente:

(local directory)/site-packages/toolkit/interface.py

Il mio codice è qui:

(local directory)/site-packages/toolkit/examples/mountain.py

Per eseguire l'esempio, scrivo python mountain.py e nel codice che ho:

from toolkit.interface import interface

E ottengo l'errore:

Traceback (most recent call last):
  File "mountain.py", line 28, in ?
    from toolkit.interface import interface
ImportError: No module named toolkit.interface

Ho già controllato sys.path e lì ho la directory / site-pacchetti . Inoltre, ho il file __init __. Py.bin nella cartella del toolkit per indicare a Python che si tratta di un pacchetto. Ho anche un __init __. Py.bin nella directory degli esempi.

Non so perché Python non riesca a trovare il file quando si trova in sys.path . Qualche idea? Può essere un problema di autorizzazioni? Ho bisogno di un permesso di esecuzione?

È stato utile?

Soluzione

Sulla base dei tuoi commenti al post di orip, suppongo che sia quello che è successo:

  1. Hai modificato __init__.py su Windows.
  2. L'editor di Windows ha aggiunto qualcosa di non stampabile, forse un ritorno a capo (fine della riga in Windows è CR / LF; in unix è solo LF), o forse un CTRL-Z (Windows fine-di- file).
  3. Hai usato WinSCP per copiare il file nella tua casella unix.
  4. WinSCP ha pensato: " Questo ha qualcosa che non è un testo di base; Metterò un'estensione .bin per indicare i dati binari. & Quot;
  5. Il __init__.py mancante (ora chiamato __init __. py.bin ) significa che Python non capisce il toolkit come un pacchetto.
  6. Crei __init__.py nella directory appropriata e tutto funziona ...?

Altri suggerimenti

non

(local directory)/site-packages/toolkit

hai un __init__.py ?

Per fare in modo che l'importazione passi attraverso le tue directory ogni directory deve avere un file __init__.py .

Su * nix, assicurati anche che PYTHONPATH sia configurato correttamente, in particolare che abbia questo formato:

 .:/usr/local/lib/python

(Ricorda il .: all'inizio, in modo che possa cercare anche nella directory corrente.)

Potrebbe anche trovarsi in altre posizioni, a seconda della versione:

 .:/usr/lib/python
 .:/usr/lib/python2.6
 .:/usr/lib/python2.7 and etc.

Mi sono imbattuto in qualcosa di molto simile quando ho fatto questo esercizio in LPTHW; Non sono mai riuscito a far riconoscere a Python che avevo file nella directory da cui stavo chiamando. Ma alla fine sono riuscito a farlo funzionare. Quello che ho fatto, e quello che raccomando, è provare questo:

(NOTA: dal tuo post iniziale, presumo che tu stia utilizzando una macchina basata su * NIX e stia eseguendo cose dalla riga di comando, quindi questo consiglio è su misura per questo. Da quando eseguo Ubuntu, questo è quello che ho fatto )

1) Cambia la directory (cd) nella directory sopra la directory in cui si trovano i tuoi file. In questo caso, stai provando a eseguire il file mountain.py e provando a chiamare il modulo toolkit.interface.py , che si trovano in directory separate. In questo caso, andresti nella directory che contiene i percorsi di entrambi i file (o, in altre parole, la directory più vicina condivisa dai percorsi di entrambi i file). Che in questo caso è la directory toolkit .

2) Quando ti trovi nella directory takeit , inserisci questa riga di codice nella riga di comando:

export PYTHONPATH =.

Questo imposta il tuo PYTHONPATH su ". " ;, che sostanzialmente significa che il tuo PYTHONPATH ora cercherà tutti i file chiamati all'interno della directory in cui ti trovi attualmente (e più precisamente, nella directory rami della directory in cui ci si trova. Quindi non solo cerca nella directory corrente, ma in tutte le directory che si trovano nella directory corrente).

3) Dopo aver impostato PYTHONPATH nel passaggio precedente, eseguire il modulo dalla directory corrente (la directory toolkit ). Python ora dovrebbe trovare e caricare i moduli specificati.

Spero che questo aiuti. Ero abbastanza frustrato con questo me stesso.

Ho risolto il mio problema e scriverò un riepilogo delle cose sbagliate e della soluzione:

Il file deve essere chiamato esattamente __init__.py . Se l'estensione è diversa, come nel mio caso .py.bin , Python non può spostarsi tra le directory e quindi non può trovare i moduli. Per modificare i file devi utilizzare un editor Linux, come vi o nano . Se usi un editor di Windows, questo scriverà alcuni caratteri nascosti.

Un altro problema che lo stava influenzando era che avevo un'altra versione di Python installata dal root, quindi se qualcuno sta lavorando con un'installazione locale di Python, assicurati che l'installazione di Python che esegue i programmi sia la Python locale. Per verificare ciò, basta fare quale python e vedere se l'eseguibile è quello che si trova nella tua directory locale. In caso contrario, modifica il percorso, ma assicurati che la directory Python locale sia precedente all'altra Python.

Per contrassegnare una directory come pacchetto è necessario un file chiamato __init__.py , questo aiuta?

una soluzione semplice è installare il modulo usando python -m pip install < library-name > invece di pip install < library-name > puoi usare sudo in caso di restrizioni amministrative

Utilizzando PyCharm (parte della suite JetBrains) è necessario definire la directory degli script come Fonte:
Fai clic destro > Segna Directory come > Sorgente radice

Yup. È necessario che la directory contenga il file __init__.py , che è il file che inizializza il pacchetto. Qui, dai un'occhiata a questo .

  

I file __init__.py sono richiesti per fare in modo che Python tratti le directory come pacchetti contenenti; ciò viene fatto per impedire alle directory con un nome comune, come stringa, di nascondere involontariamente moduli validi che si verificano successivamente nel percorso di ricerca del modulo. Nel caso più semplice, __init__.py può essere solo un file vuoto, ma può anche eseguire il codice di inizializzazione per il pacchetto o impostare la variabile __all__, descritta più avanti.

  1. Devi avere il file __ init__.py nella stessa directory in cui è il file che stai importando.
  2. Non puoi provare a importare un file con lo stesso nome ed essere un file da 2 cartelle configurate su PYTHONPATH.

ad esempio: / Etc / environment

PYTHONPATH = $ PYTHONPATH: / opt / cartella1: / opt / cartella2

/ opt / cartella1 / foo

/ opt / cartella2 / foo

E, se stai cercando di importare il file foo, python non saprà quale vuoi.

da foo import ... > > > importerror: nessun modulo chiamato foo

I miei due centesimi:

inserisci qui la descrizione dell'immagine

Spit:

Traceback (most recent call last):
      File "bash\bash.py", line 454, in main
        import bosh
      File "Wrye Bash Launcher.pyw", line 63, in load_module
        mod = imp.load_source(fullname,filename+ext,fp)
      File "bash\bosh.py", line 69, in <module>
        from game.oblivion.RecordGroups import MobWorlds, MobDials, MobICells, \
    ImportError: No module named RecordGroups

Questo mi ha confuso a morte - ho esaminato post e post che suggerivano brutti hack di syspath (come vedi i miei __init__.py erano tutti lì). Bene, risulta che game / oblivion.py e game / oblivion stavano confondendo Python che sputava piuttosto inutile "Nessun modulo chiamato RecordGroups". Sarei interessato a una soluzione alternativa e / o ai link che documentano questo comportamento (stesso nome) - > EDIT (2017.01.24) - dai un'occhiata a Che cosa succede se ho un modulo e un pacchetto con Lo stesso nome? È interessante notare che normalmente pacchetti hanno la precedenza, ma a quanto pare il nostro launcher viola questo

EDIT (2015.01.17): non ho menzionato che usiamo un launcher personalizzato dissezionato qui .

Linux: i moduli importati si trovano in /usr/local/lib/python2.7/dist-packages

Se stai usando un modulo compilato in C, non dimenticare di modificare il file .so dopo sudo setup.py install .

sudo chmod 755 /usr/local/lib/python2.7/dist-packages/*.so

Stai leggendo questa risposta dice che il tuo __init__.py è nel posto giusto, hai installato tutte le dipendenze e stai ancora ottenendo il ImportError .

Stavo affrontando un problema simile, tranne per il fatto che il mio programma funzionava bene quando veniva eseguito usando PyCharm ma l'errore sopra riportato quando lo eseguivo dal terminale. Dopo aver scavato ulteriormente, ho scoperto che PYTHONPATH non aveva la voce per la directory del progetto. Quindi, ho impostato PYTHONPATH per L'istruzione di importazione funziona su PyCharm ma non dal terminale :

export PYTHONPATH=$PYTHONPATH:`pwd`  (OR your project root directory)

C'è un altro modo per farlo usando sys.path come:

import sys
sys.path.insert(0,'<project directory>') OR
sys.path.append('<project directory>')

È possibile utilizzare insert / append in base all'ordine in cui si desidera cercare il progetto.

Nel mio caso, il problema era che stavo collegando a debug python & amp; boost :: Python , che richiede che l'estensione sia FooLib_d.pyd , non solo FooLib.pyd ; rinominare il file o aggiornare le proprietà CMakeLists.txt risolto l'errore.

Il mio problema era che ho aggiunto la directory con il file __init__.py a PYTHONPATH, quando in realtà avevo bisogno di aggiungere la sua directory principale.

Se hai provato tutti i metodi sopra indicati ma non sei riuscito, forse il tuo modulo ha lo stesso nome di un modulo integrato. Oppure, un modulo con lo stesso nome esistente in una cartella che ha una priorità alta in sys.path rispetto a quella del tuo modulo.

Per eseguire il debug, dì il tuo da foo.bar import baz reclami ImportError: nessun modulo chiamato bar . Passando a import foo; print foo , che mostrerà il percorso di foo . È quello che ti aspetti?

In caso contrario, rinominare foo o utilizzare importazioni assolute .

Nel mio caso, perché sto usando PyCharm e PyCharm creano un 'venv' per ogni progetto nella cartella del progetto, ma è solo un mini env di Python. Sebbene tu abbia installato le librerie di cui hai bisogno in Python, ma nel tuo progetto personalizzato 'venv', non è disponibile. Questo è il vero motivo di "ImportError: nessun modulo chiamato xxxxxx" si è verificato in PyCharm. Per risolvere questo problema, devi aggiungere librerie al tuo ambiente personalizzato del progetto seguendo questi passaggi:

  • In PyCharm, dal menu 'File' - > Impostazioni
  • Nella finestra di dialogo Impostazioni, Progetto: XXXProject- > Project Interpreter
  • Fai clic su " Aggiungi " , ti mostrerà la finestra di dialogo "Pacchetti disponibili"
  • Cerca nella tua libreria, fai clic su "Installa pacchetto"
  • Quindi, tutto il pacchetto necessario verrà installato nella cartella 'venv' personalizzata del progetto.

 Finestra di dialogo Impostazioni

Enjoy.

Risolto il mio problema scrivendo print (sys.path) e ho scoperto che python stava usando pacchetti scaduti nonostante un'installazione pulita. L'eliminazione di questi python creati utilizza automaticamente i pacchetti corretti.

A tutti coloro che hanno ancora questo problema. Credo che Pycharm si confonda con le importazioni. Per me, quando scrivo "dallo spazio dei nomi importa qualcosa", la riga precedente viene sottolineata in rosso, segnalando che c'è un errore, ma funziona. Tuttavia '' da .namespace importa qualcosa 'non viene sottolineato, ma non funziona.

Prova

try:
    from namespace import something 
except NameError:
    from .namespace import something

Dopo aver subito lo stesso problema, ho scoperto che la mia risoluzione era eliminare tutti i file pyc dal mio progetto, sembra che questi file memorizzati nella cache stiano causando in qualche modo questo errore.

Il modo più semplice che ho trovato è stato quello di navigare nella cartella del mio progetto in Windows Explorer e cercare * .pyc , quindi selezionare tutto ( Ctrl + A ) ed eliminandoli ( Ctrl + X ).

È possibile che avrei potuto risolvere i miei problemi semplicemente cancellando il file pyc specifico ma non l'ho mai provato

Ho riscontrato lo stesso problema: Errore di importazione . Inoltre, la libreria è stata installata correttamente al 100%. La fonte del problema era che sul mio PC sono state installate versioni di python (pacchetto anaconda) 3). Questo è il motivo per cui la libreria è stata installata no nel posto giusto. Successivamente ho appena cambiato la versione corretta di Python nel mio IDE PyCharm.

Ho avuto lo stesso errore. È stato causato da qualcuno che ha creato una cartella nella stessa cartella del mio script, il cui nome era in conflitto con un modulo che stavo importando da altrove. Invece di importare il modulo esterno, sembrava all'interno di questa cartella che ovviamente non conteneva i moduli previsti.

Ho avuto lo stesso problema (Python 2.7 Linux), ho trovato la soluzione e vorrei condividerla. Nel mio caso avevo la struttura seguente:

Booklet
-> __init__.py
-> Booklet.py
-> Question.py
default
-> __init_.py
-> main.py

In 'main.py' ho provato senza successo tutte le combinazioni qui sotto:

from Booklet import Question
from Question import Question
from Booklet.Question import Question
from Booklet.Question import *
import Booklet.Question
# and many othet various combinations ...

La soluzione era molto più semplice di quanto pensassi. Ho rinominato la cartella " Booklet " in "libretto" e basta. Ora Python può importare normalmente la classe Question usando in 'main.py' il codice:

from booklet.Booklet import Booklet
from booklet.Question import Question
from booklet.Question import AnotherClass

Da ciò posso concludere che Package-Names (cartelle) come 'booklet' deve iniziare da lettere minuscole, altrimenti Python lo confonde con nomi di classe e nomi di file.

Apparentemente, questo non era un tuo problema, ma la risposta di John Fouhy è molto buona e questa discussione ha quasi tutto ciò che può causare questo problema. Quindi, questa è un'altra cosa e spero che questo possa aiutare gli altri.

Nel mio caso stavo includendo il percorso della cartella package.egg piuttosto che il pacchetto reale sottostante. Ho copiato il pacchetto al livello più alto e ha funzionato.

Questo ha funzionato per me: File __init__.py creato nella cartella principale (nel tuo caso, nella cartella pacchetti-siti ). E importato in questo modo:

from site-packages.toolkit.interface import interface

Spero che sia utile anche per te!

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