python - Importazione di file da una cartella diversa




10 Answers

Non c'è niente di sbagliato in:

from application.app.folder.file import func_name

Assicurati che la cartella contenga anche un __init__.py , questo consente di includerlo come pacchetto. Non sono sicuro del perché le altre risposte parlino di PYTHONPATH.

python importerror python-import

Ho la seguente struttura di cartelle.

application/app/folder/file.py

e voglio importare alcune funzioni da file.py in un altro file Python che risiede in

application/app2/some_folder/some_file.py

ho provato

from application.app.folder.file import func_name

e alcuni altri vari tentativi ma fino ad ora non sono riuscito a importare correttamente. Come posso fare questo?




Penso che un modo ad-hoc sarebbe quello di utilizzare la variabile d'ambiente PYTHONPATH come descritto nella documentazione: Python2 , Python3

# Linux & OSX
export PYTHONPATH=$HOME/dirWithScripts/:$PYTHONPATH

# Windows
set PYTHONPATH=C:\path\to\dirWithScripts\;%PYTHONPATH%



Considerando l' application come directory root per il tuo progetto python, crea un file __init__.py vuoto nelle cartelle application , app e folder . Quindi nel tuo some_file.py fai le modifiche come segue per ottenere la definizione di func_name:

import sys
sys.path.insert(0, r'/from/root/directory/application')

from application.app.folder.file import func_name ## You can also use '*' wildcard to import all the functions in file.py file.
func_name()



Ha funzionato per me in python3 su linux

import sys  
sys.path.append(pathToFolderContainingScripts)  
from scriptName import functionName #scriptName without .py extension  



Primo sistema di importazione

 import sys

Secondo aggiungere il percorso della cartella

sys.path.insert(0, '/the/folder/path/name-folder/')

Terzo Crea un file vuoto chiamato __ init __.py nella tua sottodirectory (questo dice a Python che è un modulo)

  • name-file.py
    • Nome cartella
      • __ init __.py
      • name-module.py

Quarto importare il modulo all'interno della cartella

from name-folder import name-module



Prova le importazioni relative di Python:

from ...app.folder.file import func_name

Ogni punto iniziale è un altro livello superiore nella gerarchia che inizia con la directory corrente.

I problemi? Se questo non funziona per te allora probabilmente stai diventando matto per le numerose importazioni relative di Gotcha. Leggi le risposte e i commenti per maggiori dettagli: Come risolvere "Tentativo importazione relativa in non-pacchetto" anche con __init__.py

Suggerimento: avere __init__.py ad ogni livello di directory. Potresti aver bisogno di python -m application.app2.some_folder.some_file (lasciando fuori .py) che esegui dalla directory di primo livello o hai quella directory di primo livello nel tuo PYTHONPATH. Accidenti!




Se lo scopo del caricamento di un modulo da un percorso specifico è di assistervi durante lo sviluppo di un modulo personalizzato, è possibile creare un collegamento simbolico nella stessa cartella dello script di test che punta alla radice del modulo personalizzato. Questo riferimento al modulo avrà la precedenza su qualsiasi altro modulo installato con lo stesso nome per qualsiasi script eseguito in quella cartella.

Ho provato questo su Linux, ma dovrebbe funzionare in qualsiasi sistema operativo moderno che supporta collegamenti simbolici.

Un vantaggio di questo approccio è che è possibile indicare un modulo che si trova nella propria copia di lavoro del ramo SVC locale, che può semplificare notevolmente il tempo di ciclo di sviluppo e ridurre le modalità di errore della gestione di diverse versioni del modulo.




Mi sono trovato di fronte alla stessa sfida, soprattutto quando importavo più file, così sono riuscito a superarlo.

import os, sys

from os.path import dirname, join, abspath
sys.path.insert(0, abspath(join(dirname(__file__), '..')))

from root_folder import file_name



Puoi aggiornare la shell di Python premendo f5, o vai a Run-> Esegui modulo. In questo modo non devi cambiare la directory per leggere qualcosa dal file. Python cambierà automaticamente la directory. Ma se vuoi lavorare con file diversi da diverse directory in Python Shell, puoi cambiare la directory in sys, come ha detto Cameron in precedenza.




In Python 3.4 e versioni successive, è possibile importare direttamente da un file sorgente (collegamento alla documentazione) .

Ecco un esempio. Innanzitutto, il file da importare, denominato foo.py :

def announce():
    print("Imported!")

Il codice che importa il file sopra, ispirato pesantemente all'esempio nella documentazione:

import importlib, importlib.util, os.path

def module_from_file(module_name, file_path):
    spec = importlib.util.spec_from_file_location(module_name, file_path)
    module = importlib.util.module_from_spec(spec)
    spec.loader.exec_module(module)
    return module

foo = module_from_file("foo", "/path/to/foo.py")

if __name__ == "__main__":
    print(foo)
    print(dir(foo))
    foo.announce()

L'output:

<module 'foo' from '/path/to/foo.py'>
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'announce']
Imported!

Si noti che il nome della variabile, il nome del modulo e il nome del file non devono necessariamente corrispondere. Questo codice funziona ancora:

import importlib, importlib.util, os.path

def module_from_file(module_name, file_path):
    spec = importlib.util.spec_from_file_location(module_name, file_path)
    module = importlib.util.module_from_spec(spec)
    spec.loader.exec_module(module)
    return module

baz = module_from_file("bar", "/path/to/foo.py")

if __name__ == "__main__":
    print(baz)
    print(dir(baz))
    baz.announce()

L'output:

<module 'bar' from '/path/to/foo.py'>
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'announce']
Imported!

I moduli di importazione programmatica sono stati introdotti in Python 3.1 e offrono un maggiore controllo sul modo in cui i moduli vengono importati. Fare riferimento alla documentazione per ulteriori informazioni.




Related