첫 줄에`#! / usr / bin / env python`이 있으면 스크립트가 파이썬을 찾지 못하는 원인은 무엇입니까?


19

우분투 12.04에서 casperjs를 실행하려고합니다. 내가 실행할 때 설치 한 후 :

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

따라서 파이썬이 존재하고 실행 가능하며 casperjs가 올바른 위치를 가리키고 있으며 파이썬 스크립트입니다. 그러나 실행하면 "No such file"이 표시됩니다.

casperjs python 파일의 첫 번째 줄을 다음과 같이 변경하여 문제를 해결할 수 있습니다.

#!/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이 스크립트를 열지 못하는지 확인할 수 있다면 도움이 될 것입니다.
Mark Plotnick

@MarkPlotnick은 특히 100 줄의 출력 라인을 실행 했습니까?
jcollum

: No such file or directoryexecve를 시도한 출력 직전 에 출력 된 라인 . [편집 : Gilles의 대답을 보았습니다. strace 출력에서 ​​다음과 같은 행을 확인하십시오 execve("/usr/bin/python\r", ...). ]
Mark Plotnick

답변:


36

": 해당 파일 또는 디렉토리 없음"오류 (콜론 앞에 아무것도 없음)가 표시되면 shebang 행이 Windows에서 편집 되었기 때문에 마지막에 캐리지 리턴이 있음을 의미합니다 (CR, LF를 라인 구분 기호). CR 문자는 쉘이 메시지의 시작 부분을 인쇄 한 후 커서가 행의 시작 부분으로 다시 이동하게하므로 오류 메시지의 일부인 인터프리터 문자열을 종료하는 CR 이후 부분 만 볼 수 있습니다.

CR을 제거하십시오. shebang 줄에는 Unix 줄 끝 이 있어야합니다 (줄 바꿈 만). 파이썬 자체는 CRLF 줄 끝을 허용하므로 다른 줄의 CR 문자는 아프지 않습니다. 반면 쉘 스크립트에는 CR 문자가 없어야합니다.

Windows 줄 끝을 제거하려면 dos2unix 를 사용할 수 있습니다 .

sudo dos2unix /usr/local/bin/casperjs

또는 sed :

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

Windows에서 스크립트를 편집해야하는 경우 Unix 줄 끝 (예 : 메모장보다 뇌가 덜한 것)에 대응하는 편집기를 사용하고 Unix 파일을 편집 할 때 Unix 줄 끝 (예 : LF 만)을 쓰도록 구성되어 있는지 확인하십시오.


나는이 문제에 부딪 쳤지 만 항상 ^M끝에 있습니다. 나는 우분투에서 독점적으로 여기에 있지만 gedit은 때때로 ^ M을 넣어서 Geany에 갔다. 어쨌든 그것은 다른 오류를 줄 것이고 그것은 내가보고있는 오류가 아닙니다.
jcollum

1
@jcollum ^MCR을 말하는 또 다른 방법.
Gilles 'SO- 악마 그만

예, 이해하지만 더 이상 오류가 발생하지 않으므로 줄 바꿈 문제가 아닙니다.
jcollum

@jcollum shebang 행을 편집 할 때 CR을 제거했습니다. #!/usr/bin/env pythonCR을 다시 추가하지 않고로 다시 변경 하면 작동합니다.
Gilles 'SO- 악마 그만

2
CR = \r= 유니 코드 U + 0D = ^ M (Ctrl + M) 및 LF = \n= 유니 코드 U + A0 = ^ J (Ctrl + J)
wjandrea

0

Visual Studio Code를 사용하고 있으며 텍스트 편집기를 처음 사용합니다. 동일한 오류가 발생 하여이 게시물의 단계에 따라 수동으로 시도했지만 작동하지 않았습니다. 그러나 Visual Studio Code의 오른쪽 하단에는 문제가 해결 된 CR과 LF 간을 전환하는 옵션이 있습니다. 이것이 적용되는지 확실하지 않지만 텍스트 편집기에서 프로그래밍하는 경우 전환 버튼을 제공하여 간단한 답변을 제공 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.