Was kann dazu führen, dass ein Skript Python nicht findet, wenn in der ersten Zeile `#! / usr / bin / env python` steht?

19

Versuch, casperjs unter Ubuntu 12.04 zum Laufen zu bringen. Nach der Installation beim Ausführen erhalte ich:

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

Python ist also vorhanden und lauffähig, casperjs zeigt auf die richtige Stelle und es ist ein Python-Skript. Aber wenn ich es laufen lasse, erhalte ich "keine solche Akte".

Ich kann das Problem beheben, indem ich die erste Zeile der casperjs-Python-Datei ändere von:

#!/usr/bin/env python

zu:

#!/usr/bin/python

Ergebnis:

$ casperjs --version
1.1.0-DEV

Ich habe es geschafft, es zu beheben, aber ich frage mich, warum es nicht funktioniert hat #!/usr/bin/env python, da dies eine normale Interpreterzeile zu sein scheint. Habe ich etwas falsch konfiguriert?

Hier sind die Schritte, um casperjs zu bekommen:

$ 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
quelle
Können Sie versuchen, strace /usr/local/bin/casperjsauf der nicht funktionierenden Version zu laufen? Wäre hilfreich, wenn wir sehen könnten, welche Dateien env ausführt und ob env Python nicht findet oder Python das Skript nicht öffnet.
Mark Plotnick
@ MarkPlotnick lief das, 100s von Zeilen der Ausgabe, etwas Besonderes?
jcollum
Alle Zeilen, die unmittelbar vor : No such file or directoryder Ausgabe ausgegeben wurden und versuchte Ausführungen enthalten. Ich habe gerade Gilles 'Antwort gesehen. Suchen Sie in der Ausgabe nach Linien, die aussehen execve("/usr/bin/python\r", ...). ]
Mark Plotnick

Antworten:

36

Wenn Sie den Fehler ": Keine solche Datei oder kein solches Verzeichnis" sehen (mit nichts vor dem Doppelpunkt), bedeutet dies, dass Ihre shebang-Zeile am Ende einen Zeilenumbruch hat, vermutlich, weil sie unter Windows bearbeitet wurde (wobei CR, LF als Zeichen verwendet wird) Zeilentrenner). Das CR-Zeichen bewirkt, dass der Cursor an den Anfang der Zeile zurückspringt, nachdem die Shell den Anfang der Nachricht gedruckt hat, sodass Sie nur den Teil nach CR sehen, der die Interpreterzeichenfolge beendet, die Teil der Fehlermeldung ist.

CR entfernen: Die Shebang-Linie muss ein Unix- Zeilenende haben (nur Zeilenvorschub). Python selbst erlaubt CRLF-Zeilenenden, sodass die CR-Zeichen in anderen Zeilen nicht weh tun. Shell-Skripte müssen dagegen frei von CR-Zeichen sein.

Um die Windows-Zeilenenden zu entfernen, können Sie dos2unix verwenden :

sudo dos2unix /usr/local/bin/casperjs

oder sed:

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

Wenn Sie Skripte unter Windows bearbeiten müssen, verwenden Sie einen Editor, der mit Unix-Zeilenenden fertig wird (dh etwas, das weniger verrückt ist als Notepad), und stellen Sie sicher, dass es so konfiguriert ist, dass Unix-Zeilenenden (dh nur LF) beim Bearbeiten einer Unix-Datei geschrieben werden.

Gilles 'SO - hör auf böse zu sein'
quelle
Ich bin auf dieses Problem gestoßen, aber es steht immer ^Mam Ende. Ich bin hier ausschließlich in Ubuntu, aber gedit setzt das manchmal ein, also bin ich zu Geany gegangen. Auf jeden Fall wird es einen anderen Fehler geben und das ist nicht der Fehler, den ich sehe.
jcollum
1
@ jcollum eine ^Mandere Art, CR zu sagen.
Gilles 'SO- hör auf böse zu sein'
Ja, ich verstehe das, aber was ich sage, ist, dass ich diesen Fehler nicht mehr erhalte, es ist also kein Zeilenumbruchproblem.
jcollum
@jcollum Sie haben die CR entfernt, als Sie die Shebang-Linie bearbeitet haben. Wenn Sie es wieder ändern #!/usr/bin/env python(ohne einen CR hinzuzufügen), funktioniert es.
Gilles 'SO- hör auf böse zu sein'
2
Hinweis für alle, die mit der Terminologie verwirrt sind: CR = \r= Unicode U + 0D = ^ M (Strg + M) und LF = \n= Unicode U + A0 = ^ J (Strg + J)
wjandrea
0

Ich verwende Visual Studio Code und bin neu im Texteditor. Ich habe den gleichen Fehler erhalten und manuell versucht, indem ich die Schritte in diesem Beitrag befolge. Das hat bei mir nicht funktioniert. In Visual Studio Code bietet die untere rechte Ecke jedoch eine Option, um im laufenden Betrieb zwischen CR und LF zu wechseln. Das Problem wurde behoben. Ich bin nicht sicher, ob dies zutrifft, aber wenn Sie in einem Texteditor programmieren, kann dies eine einfache Antwort sein, indem Sie eine Schaltfläche zum Umschalten bereitstellen.

Gerald
quelle