Riferimento a moduli Python e file di dati personalizzati

0

Vorrei distribuire il mio codice Python e file statici rilevanti in modo tale che sia necessaria solo una copia di una cartella. Cioè, tutti i percorsi all'interno sono relativi. La versione è destinata a un server Web, che chiama script in un sottoprocesso.

Naturalmente, tutto funziona nel mio ambiente in PyCharm. I problemi sorgono quando sottoprocesso Python ed eseguo script da una directory di lavoro arbitraria. Questo può essere evitato in alcuni modi:

  • Utilizza percorsi assoluti quando fai riferimento ai file
  • Utilizza le importazioni relative con i sottomoduli
  • Aggiungi percorsi a sys.path per utilizzare percorsi relativi
  • Modifica la directory di lavoro dell'host
  • Modifica la struttura del file di progetto

Ho problemi con questi approcci.

  • I percorsi assoluti non funzioneranno quando il codice viene spostato
  • Le importazioni relative funzionano solo con i moduli sub , non nella struttura dei file
  • L'aggiunta a sys.path all'inizio di ogni script è brutta e ingombrante
  • Avere tutti i file sorgente nella radice del progetto è disordinato

Queste potrebbero non essere le migliori ragioni per lamentarsi, ma nella mia esperienza, altre persone hanno più esperienza con quasi tutte le cose e potrebbero conoscere un trucco che non ho ancora incontrato.

Come ti avvicineresti a questo? ( ansimare , un'opinione!) Molte grazie! Qualsiasi aiuto è molto apprezzato.

Modifica: strutture di file di esempio

Root\                       Root\                    Root\
    Data\                       Data\                    Data\
        Data.csv                    Data.csv                Data.csv
        Text.txt                    Text.txt                Text.txt
    Sources\                    Sources\
        Script.py                   Script.py            Script.py
        Module.py                   Module.py            Module.py
        Needs_data.py           Needs_data.py            Needs_data.py
        Data_and_module.py      Data_and_module.py       Data_and_module.py

Queste sono alcune opzioni che ho trovato per impostare una struttura di file. Quasi tutti gli script devono importare un modulo e aprire file in Data . Idealmente la struttura sarebbe il primo tipo, possibilmente con sottocartelle.

    
posta Felix 17.07.2018 - 10:57
fonte

2 risposte

3

Ciò che è fondamentale nella gerarchia dei file è __init__.py . Queste sono le differenze distintive tra una collezione di script Python / dati e un Python package .

Mi sto anche chiedendo perché sei moving del tuo codice. La codifica non è un'attività del mobile-mobile (spostando cose come in un altro posto), è un'attività di architettura (tu crei il piano, allora tu crei le cose in quell'altro luogo ).

Nel mondo Python, questo viene fatto creando pacchetti Python e prima si distribuisce il pacchetto Python

  • costruire un pacchetto distribuibile (un uovo, una ruota, qualunque cosa)
  • installazione di un pacchetto distribuibile

Al giorno d'oggi la soluzione moderna si basa su setuptools e sul pacchetto di distribuzione delle ruote, ma ci sono state diverse soluzioni con diversi strumenti nella storia di Python.

Dovrai capire cos'è un setup.py e perché ne hai bisogno, cos'è __init__.py e come creare un vero pacchetto Python

alla fine dovresti ottenere qualcosa di simile

Root
    data_treatment
        data                                 
            Data.csv       
            Text.txt       
        scripts
            Script.py      
        __init__.py
        module.py
        Module.py      
        Needs_data.py  
        Data_and_module.py 

nel tuo setup.py, dovrai utilizzare package_data o direttiva simile per includere i tuoi file di dati nel tuo pacchetto distribuibile, quindi utilizzare tali dati tramite pkg_resources

I tuoi script potrebbero essere accessibili come console_scripts punti di ingresso, definiti nel tuo setup.py.

Distribuirai il tuo codice in un'altra posizione installandolo lì, sia esso in un virtualenv o altro, usando pip o no, scegli

Ma quando la struttura è così, le importazioni relative vanno bene, e non importa dove o come è stato installato il pacchetto, avrai accesso a import data_treatment e tutto il codice e i dati sottostanti senza dover smanettare con qualsiasi percorso.

    
risposta data 17.07.2018 - 23:48
fonte
0

Le importazioni relative funzionano sull'albero, purché tu rimanga all'interno dello stesso pacchetto:

#my_package/subpackage1/c.py:
print('hi')

#my_package/subpackage2/d.py:
from ..subpackage1 import c

Le importazioni relative sono davvero la strada da percorrere qui.

Se aggiungi un modulo nella stessa directory di my_package , puoi fare:

#run_my_package.py:
from my_package import main

main() #just an example of course

E quindi, indipendentemente dalla directory di lavoro, puoi eseguire quello script.

    
risposta data 17.07.2018 - 11:09
fonte

Leggi altre domande sui tag