2016-03-08 9 views

risposta

7

Perché quello che si sta utilizzando con python script.py è il programma python; quindi carica ed esegue lo script specificato nei parametri, ovvero script.py (fondamentalmente un file di testo). Il file di script non ha bisogno di essere un eseguibile perché ciò che viene eseguito qui è l'interprete python (lo stesso binario python, che dovrebbe ovviamente avere l'autorizzazione x).

Con .\script.py, si tenta di eseguire direttamente lo script (sempre lo stesso file di testo) come un programma. Quando lo fai, vuoi che venga analizzato con l'interprete che hai specificato nella prima riga del tuo codice di script, lo "shebang", ad es. #!/usr/bin/env python. Se non è impostato con l'autorizzazione x, il sistema operativo non tenta di "eseguire" il file (anche se potrebbe provare ad aprirlo con il programma predefinito, ove applicabile), quindi, non si preoccuperà dello shebang.

+1

Per imparare più su come funziona, cerca unix shebangs https://en.wikipedia.org/wiki/Shebang_%28Unix%29 – xvan

4

il file stesso ha interpretato (leggere) piuttosto che effettivamente eseguito nel tuo primo esempio. L'applicazione python è ciò che richiede diritti di esecuzione.

Nel secondo esempio il file stesso è in esecuzione, quindi necessita di tali diritti per poter procedere.

2

Quando eseguiamo uno script come python script.py in realtà invochiamo l'interprete python che si trova in genere a /usr/bin/python (L'output di which python ti dirà dove esattamente).

L'interprete a sua volta legge gli script ed esegue il suo codice. È l'l'interprete che ha il permesso di esecuzione.

Quando uno script viene eseguito come ./script.py, lo script viene eseguito direttamente e quindi lo script richiede il permesso di esecuzione. L'interprete utilizzato è specificato dalla riga shebang.

Quando il kernel rileva che i primi due byte sono #!, utilizza il resto della riga come interprete e passa il file come argomento. Si noti che per fare ciò il file deve avere il permesso di esecuzione. Nel primo caso stiamo indirettamente facendo ciò che il kernel avrebbe fatto se avessimo eseguito lo script come ./script.py

In breve per l'esecuzione dal method1 l'interprete ha bisogno di permesso di sola lettura, ma per poi ha bisogno di eseguirlo direttamente

Problemi correlati