що може призвести до того, що скрипт не зможе знайти 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

Чи можете ви спробувати запустити strace /usr/local/bin/casperjsнеробочу версію? Було б корисно, якби ми могли побачити, які файли env намагається виконати, і чи env не знаходить python чи python не вдається відкрити скрипт.
Марк Плотнік

@MarkPlotnick запустив це, 100-ти рядків виводу, що-небудь зокрема?
jcollum

Будь-які рядки, випущені безпосередньо перед : No such file or directoryвиведенням, містять спроби execve. [редагувати: щойно побачив відповідь Гілла. Перевірте, чи не виглядають лінії у вихідному штриху 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

або sed:

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.
Жил 'SO- перестань бути злим'

Так, я це розумію, але те, що я говорю, це те, що я більше не отримую цієї помилки, тому це не проблема розриву рядків.
jcollum

@jcollum Ви видалили CR, коли ви редагували рядок shebang. Якщо ви зміните його назад #!/usr/bin/env python(без додавання CR), він буде працювати.
Жил 'SO- перестань бути злим'

2
Примітка для тих, хто плутає термінологію: CR = \r= Unicode U + 0D = ^ M (Ctrl + M), а LF = \n= Unicode U + A0 = ^ J (Ctrl + J)
wjandrea

0

Я використовую Visual Studio Code і я новачок у текстовому редакторі. Я отримував ту саму помилку і намагався вручну виконувати кроки в цій публікації, для мене це не спрацювало. Однак у коді Visual Studio Code в нижньому правому куті передбачено можливість перемикання між CR та LF на ходу, проблема вирішена. Я не впевнений, чи це стосується, але якщо ви програмуєте в текстовому редакторі, він може дати просту відповідь, надавши кнопку для перемикання.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.