что может привести к тому, что скрипт не сможет найти python, когда в его строке `#! / usr / bin / env python`?

19

Попытка запустить casperjs на Ubuntu 12.04. После установки я получаю:

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 присутствует и работает, casperjs указывает на правильное место, и это скрипт Python. Но когда я запускаю его, я получаю «Нет такого файла».

Я могу это исправить, изменив первую строку файла python casperjs из:

#!/usr/bin/env python

чтобы:

#!/usr/bin/python

Результат:

$ casperjs --version
1.1.0-DEV

Мне удалось это исправить, но мне интересно, почему это не сработало #!/usr/bin/env python, так как это, кажется, нормальная линия интерпретатора. У меня что-то настроено неправильно?

Вот шаги, чтобы получить 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
источник
Можете ли вы попробовать запустить strace /usr/local/bin/casperjsна неработающей версии? Было бы полезно, если бы мы могли видеть, какие файлы env пытается выполнить, и если env не может найти python или python не может открыть скрипт.
Марк Плотник
@MarkPlotnick запустил это, сотни строк вывода, что-нибудь конкретное?
Jcollum
Любые строки, выданные непосредственно перед : No such file or directoryвыводом, которые содержат попытки execve. [править: только что увидел ответ Жиля. Проверьте строки в выводе strace, которые выглядят как execve("/usr/bin/python\r", ...). ]
Марк Плотник

Ответы:

36

Если вы видите сообщение об ошибке: «Нет такого файла или каталога» (без двоеточия), это означает, что ваша строка shebang имеет возврат каретки в конце, предположительно потому, что она была отредактирована в Windows (которая использует CR, LF в качестве разделитель строк). Символ CR заставляет курсор перемещаться обратно в начало строки после того, как оболочка напечатает начало сообщения, и поэтому вы можете увидеть только ту часть после CR, которая заканчивает строку интерпретатора, которая является частью сообщения об ошибке.

Удалите CR: строка shebang должна иметь конец строки Unix (только перевод строки). Сам Python допускает окончания строк CRLF, поэтому символы CR на других строках не помешают. Сценарии оболочки, с другой стороны, не должны содержать символов CR.

Чтобы удалить окончания строки Windows, вы можете использовать dos2unix :

sudo dos2unix /usr/local/bin/casperjs

или сед:

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

Если вам необходимо отредактировать сценарии в Windows, используйте редактор, который справляется с окончаниями строк Unix (то есть с чем-то менее умопомрачительным, чем Notepad), и убедитесь, что он настроен на запись окончаний строк Unix (т.е. только LF) при редактировании файла Unix.

Жиль "ТАК - перестань быть злым"
источник
Я столкнулся с этой проблемой, но она всегда имеет ^Mв конце. Я здесь исключительно в Ubuntu, но Gedit иногда добавляет это ^ M, поэтому я пошел в Geany. В любом случае, это даст другую ошибку, и это не та ошибка, которую я вижу.
Jcollum
1
@jcollum ^Mеще один способ сказать CR.
Жиль "ТАК - перестань быть злым"
Да, я понимаю, но я говорю, что больше не получаю эту ошибку, так что это не проблема разрыва строки.
Jcollum
@jcollum Вы удалили CR, когда редактировали строку Шебанга. Если вы вернете его обратно #!/usr/bin/env python(без добавления CR), оно будет работать.
Жиль "ТАК - перестань быть злым"
2
Примечание для тех, кто запутался в терминологии: CR = \r= Unicode U + 0D = ^ M (Ctrl + M) и LF = \n= Unicode U + A0 = ^ J (Ctrl + J)
wjandrea
0

Я использую код Visual Studio и я новичок в текстовом редакторе. Я получал ту же ошибку и пытался вручную выполнить действия, описанные в этом сообщении, у меня это не сработало. Однако в правом нижнем углу кода Visual Studio предусмотрена возможность переключаться между CR и LF на лету, проблема решена. Я не уверен, применимо ли это, но если вы программируете в текстовом редакторе, он может дать простой ответ, предоставив кнопку для переключения.

Джеральд
источник