Come posso usare uno script Python nella riga di comando senza eseguire il cd-ing nella sua directory? È il PITONEPATO?


157

Come posso usare PYTHONPATH? Quando provo a eseguire uno script nel percorso, il file non viene trovato. Quando eseguo il cd nella directory contenente lo script, viene eseguito lo script. Quindi a che serve il PITONEPATO?

$ echo $PYTHONPATH
:/home/randy/lib/python

$ tree -L 1 '/home/randy/lib/python' 
/home/randy/lib/python
├── gbmx_html.py
├── gbmx.py
├── __init__.py
├── __pycache__
├── scripts
└── yesno.py

$ python gbmx.py -h
python: can't open file 'gbmx.py': [Errno 2] No such file or directory

$ cd '/home/randy/lib/python'

Dopo cd nella directory dei file viene eseguito ..

$ python gbmx.py -h
usage: gbmx.py [-h] [-b]

Perché non posso usare alcun PYTHONPATH?


1
Possiamo cambiare il titolo di questo post? In realtà non sta chiedendo una spiegazione di PYTHONPATH.
Nico Cernek,

Titolo modificato perché questa è la prima cosa che si presenta quando si gioca a googlePYTHONPATH
Raphael, il

Risposte:


194

Penso che tu sia un po 'confuso. PYTHONPATH imposta il percorso di ricerca per l' importazione di moduli Python, non per eseguirli come stai provando.

PYTHONPATH Aumenta il percorso di ricerca predefinito per i file del modulo. Il formato è lo stesso del PERCORSO della shell: uno o più percorsi di directory separati da os.pathsep (es. Due punti su Unix o punti e virgola su Windows). Le directory inesistenti vengono silenziosamente ignorate.

Oltre alle normali directory, le singole voci PYTHONPATH possono fare riferimento a file zip contenenti moduli Python puri (in formato sorgente o compilato). I moduli di estensione non possono essere importati da file zip.

Il percorso di ricerca predefinito dipende dall'installazione, ma generalmente inizia con prefisso / lib / pythonversion (vedere PYTHONHOME sopra). Viene sempre aggiunto a PYTHONPATH.

Una directory aggiuntiva verrà inserita nel percorso di ricerca davanti a PYTHONPATH come descritto sopra in Opzioni di interfaccia. Il percorso di ricerca può essere manipolato da un programma Python come variabile sys.path.

http://docs.python.org/2/using/cmdline.html#envvar-PYTHONPATH

Quello che stai cercando è PERCORSO.

export PATH=$PATH:/home/randy/lib/python 

Tuttavia, per eseguire il tuo script Python come programma, devi anche impostare uno shebang per Python nella prima riga. Qualcosa del genere dovrebbe funzionare:

#!/usr/bin/env python

E dare i privilegi di esecuzione ad esso:

chmod +x /home/randy/lib/python/gbmx.py

Quindi dovresti essere in grado di correre semplicemente gmbx.pyda qualsiasi luogo.


2
Grazie amico. Lo sto ancora stirando. Il mio script riesce a importare i miei moduli dal mio PYTHONPATH personalizzato. E ora capisco la differenza: si tratta solo di script vs. modulo; comando script call vs. importazione python. Sì, in effetti useròexport PATH=$PATH:/home/etc
Randy Skretka l'

57

Stai confondendo PATH e PYTHONPATH. Devi fare questo:

export PATH=$PATH:/home/randy/lib/python 

PYTHONPATH viene utilizzato dall'interprete python per determinare quali moduli caricare.

PATH viene utilizzato dalla shell per determinare quali eseguibili eseguire.


38

PYTHONPATHinfluisce solo sulle importistruzioni, non sulla ricerca dell'interprete Python di livello superiore dei file Python forniti come argomenti.

La necessità PYTHONPATHdi essere impostati non è una grande idea - come per qualsiasi cosa che dipenda dalle variabili di ambiente, diventa difficile replicare le cose in modo coerente su macchine diverse. Meglio usare i 'pacchetti' di Python che possono essere installati (usando 'pip', o distutils) in percorsi dipendenti dal sistema che Python conosce già.

Leggi https://the-hitchhikers-guide-to-packaging.readthedocs.org/en/latest/ - 'The Hitchhiker's Guide to Packaging', e anche http://docs.python.org/3/tutorial /modules.html - che spiega PYTHONPATH e pacchetti a un livello inferiore.


Punto preso. In questo caso particolare, però, l'aggiunta a PYTHONPATH sembra funzionare bene. Come utente su una macchina posso usare e riutilizzare un po 'di codice .py già scritto.
Randy Skretka,

1
Onestamente non penso che installare cose in percorsi dipendenti dal sistema, con accesso root richiesto, sia un'idea migliore dell'uso PYTHONPATH. Non conto più quante volte ho avuto a che fare con un rudimentale programma Python che ha insistito sul fatto pip installche ero un utente normale su un host non solo senza accesso root (so che pip può fare l'installazione locale) ma anche senza pip. Ecco un consiglio a tutti coloro che distribuiscono il software Python: prima prova a installare il tuo software su un host Linux vanilla in cui non hai accesso root e solo distribuzione Python core senza pip.
AMN

3

Penso che tu sia confuso tra PATH e PYTHONPATH. Tutto quello che devi fare per eseguire uno 'script' è avere la sua directory parentale aggiunta alla tua variabile PATH. Puoi testarlo eseguendo

which myscript.py

Inoltre, se myscripy.pydipende da moduli personalizzati, le loro directory parentali devono anche essere aggiunte alla variabile PYTHONPATH. Sfortunatamente, poiché i progettisti di Python erano chiaramente drogati, testare le tue importazioni in sostituzione con quanto segue non garantirà che PYTHONPATH sia impostato correttamente per l'uso in uno script. Questa parte della programmazione di Python è magica e non è possibile rispondere in modo appropriato su StackOverflow.

$python
Python 2.7.8 blahblahblah
...
>from mymodule.submodule import ClassName
>test = ClassName()
>^D
$myscript_that_needs_mymodule.submodule.py
Traceback (most recent call last):
  File "myscript_that_needs_mymodule.submodule.py", line 5, in <module>
    from mymodule.submodule import ClassName
  File "/path/to/myscript_that_needs_mymodule.submodule.py", line 5, in <module>
    from mymodule.submodule import ClassName
ImportError: No module named submodule

3

Con PYTHONPATH impostato come nel tuo esempio, dovresti essere in grado di farlo

python -m gmbx

-mL'opzione consentirà a Python di cercare il tuo modulo nei percorsi in cui Python generalmente cerca i moduli, incluso ciò che hai aggiunto a PYTHONPATH. Quando si esegue l'interprete come python gmbx.py, cerca un file particolare e PYTHONPATH non si applica.

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.