cosa potrebbe far sì che uno script non riesca a trovare Python quando ha `#! / usr / bin / env python` nella prima riga?


19

Cercando di far funzionare casperjs su Ubuntu 12.04. Dopo averlo installato quando corro ottengo:

09:20 $ ll /usr/local/bin/casperjs
lrwxrwxrwx 1 root root 26 Nov  6 16:49 /usr/local/bin/casperjs -> /opt/casperjs/bin/casperjs

09:20 $ /usr/bin/env python --version
Python 2.7.3

09:20 $ cat /opt/casperjs/bin/casperjs | head -4 
#!/usr/bin/env python

import os
import sys

09:20 $ casperjs
: No such file or directory

09: 22 $ python
Python 2.7.3 (default, Sep 26 2013, 20:03:06) 
[GCC 4.6.3] on linux2

Quindi Python è presente e eseguibile, casperjs punta nel posto giusto ed è uno script Python. Ma quando lo eseguo ottengo "Nessun file del genere".

Posso risolverlo cambiando la prima riga del file python casperjs da:

#!/usr/bin/env python

per:

#!/usr/bin/python

Risultato:

$ casperjs --version
1.1.0-DEV

Sono riuscito a risolverlo, ma mi chiedo perché non abbia funzionato #!/usr/bin/env python, dal momento che sembra essere una normale linea di interpreti. Ho qualcosa di configurato sbagliato?

Ecco i passaggi per ottenere casperjs:

$ git clone git://github.com/n1k0/casperjs.git
$ cd casperjs
$ ln -sf `pwd`/bin/casperjs /usr/local/bin/casperjs
$ casperjs
: No such file or directory

Puoi provare a eseguire strace /usr/local/bin/casperjsla versione non funzionante? Sarebbe utile se potessimo vedere quali file env tenta di eseguire e se env non riesce a trovare Python o Python non riesce ad aprire lo script.
Mark Plotnick,

@MarkPlotnick ha funzionato così, centinaia di righe di output, qualcosa in particolare?
jcollum,

Tutte le righe emesse prima : No such file or directorydell'output che contengono i tentativi di esecuzione. [modifica: ho appena visto la risposta di Gilles. Controllare le linee nell'output di strace che sembrano execve("/usr/bin/python\r", ...). ]
Mark Plotnick,

Risposte:


36

Se viene visualizzato l'errore ": Nessun file o directory" (con nulla prima dei due punti), significa che la riga shebang ha un ritorno a capo alla fine, presumibilmente perché è stata modificata in Windows (che utilizza CR, LF come separatore di linea). Il carattere CR fa tornare il cursore all'inizio della riga dopo che la shell ha stampato l'inizio del messaggio e quindi si vede solo la parte dopo CR che termina la stringa dell'interprete che fa parte del messaggio di errore.

Rimuovi CR: la linea shebang deve avere un finale di linea Unix (solo linefeed). Lo stesso Python consente di terminare le linee CRLF, quindi i caratteri CR su altre linee non fanno male. Gli script della shell invece devono essere privi di caratteri CR.

Per rimuovere i finali di linea di Windows, puoi usare dos2unix :

sudo dos2unix /usr/local/bin/casperjs

o sed:

sudo sed -i -e 's/\r$//' /usr/local/bin/casperjs

Se è necessario modificare gli script in Windows, utilizzare un editor che gestisca i finali di linea Unix (ovvero qualcosa di meno morto rispetto al Blocco note) e assicurarsi che sia configurato per scrivere i finali di linea Unix (cioè solo LF) quando si modifica un file Unix.


Ho riscontrato questo problema, ma ^Malla fine ha sempre un problema . Sono esclusivamente su Ubuntu qui, ma gedit inserisce comunque ^ M a volte, quindi sono andato a Geany. Comunque darà un errore diverso e questo non è l'errore che sto vedendo.
jcollum,

1
@jcollum ^Mun altro modo di dire CR.
Gilles 'SO- smetti di essere malvagio' il

Sì, lo capisco, ma quello che sto dicendo è che non ricevo più quell'errore, quindi non è un problema di interruzione di linea.
jcollum,

@jcollum Hai rimosso il CR quando hai modificato la linea shebang. Se lo cambi di nuovo in #!/usr/bin/env python(senza aggiungere nuovamente un CR), funzionerà.
Gilles 'SO- smetti di essere malvagio'

2
Nota per chiunque sia confuso sulla terminologia: CR = \r= Unicode U + 0D = ^ M (Ctrl + M) e LF = \n= Unicode U + A0 = ^ J (Ctrl + J)
wjandrea,

0

Sto usando Visual Studio Code e sono nuovo nell'editor di testo. Stavo ricevendo lo stesso errore e ho provato manualmente seguendo i passaggi in questo post, non ha funzionato per me. Tuttavia, nell'angolo in basso a destra di Visual Studio Code è disponibile un'opzione per alternare tra CR e LF al volo, problema risolto. Non sono sicuro che ciò si applichi, ma se si sta programmando in un editor di testo, potrebbe fornire una risposta semplice fornendo un pulsante per passare.

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.