2012-03-22 10 views
6

Una differenza è che "./script.py" funziona solo se script.py è eseguibile (come in file permessi), ma "python script.py" funziona indipendentemente. Tuttavia, sospetto fortemente che ci siano più differenze e voglio sapere cosa sono.Quando si richiama uno script Python, qual è la differenza tra "./script.py" e "python script.py"

Possiedo un sito Web Django e "python manage.py syncdb" funziona bene, ma "./manage.py syncdb" crea un database interrotto per qualche motivo che rimane un mistero per me. Forse ha a che fare con il fatto che syncdb richiede un nome utente e una password di superuser dalla riga di comando, e forse usando "./manage.py syncdb" cambia il modo in cui interagisce con la riga di comando, maneggiando così la password. Può essere? Sono solo sconcertato da questo bug. "python manage.py syncdb" lo risolve completamente, quindi questa è solo curiosità.

Grazie.

Modifica: Giusto, giusto, ho dimenticato la necessità della linea shebang #!/Usr/bin/python. Ma ho appena controllato, "python manage.py syncdb" e "./manage.py syncdb" stanno usando lo stesso interprete Python (2.7.2, l'unico installato, su Linux Mint 12). Eppure il primo funziona e il secondo no.

Le variabili di ambiente viste dal codice Python potrebbero essere diverse? Il mio codice richiede $ LD_LOADER_PATH e $ PYTHON_PATH per essere impostato speciale per ogni shell.

risposta

6

La chiamata ./script.py utilizza la "riga shebang" nello script per determinare quale interprete utilizzare per eseguire lo script. Tale linea potrebbe apparire come

#!/usr/bin/env python 

o

#!/usr/bin/python2.7 

o qualunque sia il percorso per l'interprete Python viene utilizzato. Se risolve allo stesso interprete Python che viene chiamato semplicemente

python 

dalla riga di comando shell, non c'è differenza tra ./script.py e python script.py, ma i due versione può finire con diversi interpreti Python.

0

./script.py esegue l'interprete definito nello #! all'inizio del file. Ad esempio, la prima riga potrebbe essere #! /usr/bin/env python o #! /usr/bin/python o qualcosa di simile. Se si guarda a quale interprete viene richiamato, si potrebbe essere in grado di risolvere il problema.

1

./script.py = "Tentativo di eseguire un file chiamato script.py nella shell corrente"

python script.py = "Invia script.py come argomento per la prima python eseguibile nella corrente $PATH"

La prima funziona solo se il file ha il bit di esecuzione impostato per l'utente che tenta di eseguire il file e ha la cosiddetta riga shebang, che indica alla shell come eseguirlo.

0

In Linux utilizzando il terminale è possibile eseguire qualsiasi file, se l'utente ha il permesso di esecuzione, digitando ./fileName. Quando il sistema operativo vede un'intestazione valida come #! /usr/bin/python (o per perl #! /usr/bin/python), chiamerà l'interprete python o perl (appropriato) per eseguire il programma.È possibile utilizzare direttamente il comando python script.py perché, python è un programma eseguibile situato a /usr/bin (o altrove) che si trova in una variabile ambientale $ PATH, corrispondente alla directory di eseguibili.

Problemi correlati