¿Qué podría hacer que un script no encuentre Python cuando tiene `#! / usr / bin / env python` en la primera línea?

19

Intentando ejecutar casperjs en Ubuntu 12.04. Después de instalarlo cuando ejecuto me sale:

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

Entonces, Python está presente y se puede ejecutar, casperjs apunta al lugar correcto y es un script de Python. Pero cuando lo ejecuto me sale "No existe ese archivo".

Puedo solucionarlo cambiando la primera línea del archivo python de casperjs de:

#!/usr/bin/env python

a:

#!/usr/bin/python

Resultado:

$ casperjs --version
1.1.0-DEV

Me las arreglé para arreglarlo, pero me pregunto por qué no funcionó #!/usr/bin/env python, ya que parece ser una línea de intérprete normal. ¿Tengo algo mal configurado?

Estos son los pasos para obtener 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
jcollum
fuente
¿Puedes intentar ejecutar strace /usr/local/bin/casperjsla versión no funcional? Sería útil si pudiéramos ver qué archivos env intenta ejecutar, y si env no puede encontrar python o python no puede abrir el script.
Mark Plotnick el
@ MarkPlotnick ejecutó eso, cientos de líneas de salida, ¿algo en particular?
jcollum
Cualquier línea emitida justo antes de la : No such file or directorysalida que contenga intentos de ejecución. [editar: acabo de ver la respuesta de Gilles. Verifique las líneas en la salida de strace que se parecen execve("/usr/bin/python\r", ...). ]
Mark Plotnick

Respuestas:

36

Si ve el error ": No existe tal archivo o directorio" (sin nada antes de los dos puntos), significa que su línea shebang tiene un retorno de carro al final, presumiblemente porque fue editado en Windows (que usa CR, LF como separador de línea). El carácter CR hace que el cursor retroceda al comienzo de la línea después de que el shell imprime el comienzo del mensaje y, por lo tanto, solo puede ver la parte después de CR que finaliza la cadena de intérprete que es parte del mensaje de error.

Elimine el CR: la línea shebang debe tener un final de línea Unix (solo salto de línea). Python mismo permite terminaciones de línea CRLF, por lo que los caracteres CR en otras líneas no duelen. Los scripts de shell, por otro lado, deben estar libres de caracteres CR.

Para eliminar las terminaciones de línea de Windows, puede usar dos2unix :

sudo dos2unix /usr/local/bin/casperjs

o sed:

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

Si debe editar scripts en Windows, use un editor que haga frente a los finales de línea de Unix (es decir, algo menos mortal que el Bloc de notas) y asegúrese de que esté configurado para escribir finales de línea de Unix (es decir, solo LF) al editar un archivo Unix.

Gilles 'SO- deja de ser malvado'
fuente
Me he encontrado con este problema, pero siempre tiene un ^Mfinal. Estoy exclusivamente en Ubuntu aquí pero todavía gedit pone ese ^ M a veces, así que fui a Geany. De todos modos, dará un error diferente y ese no es el error que estoy viendo.
jcollum
1
@jcollum ^Motra forma de decir CR.
Gilles 'SO- deja de ser malvado'
Sí, lo entiendo, pero lo que digo es que ya no obtengo ese error, por lo que no es un problema de salto de línea.
jcollum
@jcollum Eliminaste el CR cuando editaste la línea shebang. Si lo cambia de nuevo a #!/usr/bin/env python(sin volver a agregar un CR), funcionará.
Gilles 'SO- deja de ser malvado'
2
Nota para cualquier persona confundida acerca de la terminología: CR = \r= Unicode U + 0D = ^ M (Ctrl + M), y LF = \n= Unicode U + A0 = ^ J (Ctrl + J)
wjandrea
0

Estoy usando Visual Studio Code y soy nuevo en el editor de texto. Estaba recibiendo el mismo error e intenté seguir manualmente los pasos en esta publicación, no funcionó para mí. Sin embargo, en Visual Studio Code, la esquina inferior derecha proporciona una opción para cambiar entre CR y LF sobre la marcha, problema resuelto. No estoy seguro de si esto se aplica, pero si está programando en un editor de texto, puede proporcionar una respuesta simple al proporcionar un botón para cambiar.

Gerald
fuente