最初の行に `#!/ usr / bin / env python`があると、スクリプトがpythonを見つけられない原因は何ですか?


19

Ubuntu 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

したがって、Pythonは存在し、実行可能です。casperjsは適切な場所を指しており、それはpythonスクリプトです。しかし、実行すると「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がスクリプトを開けないのかを確認できれば助かります。
マークプロトニック

@MarkPlotnickは、何百行もの出力、特に何かを実行しましたか?
jcollum

: No such file or directory出力しようとする直前に出力され、試行された行を含む行。[編集:Gillesの答えを見た。strace出力で、次のような行を確認しますexecve("/usr/bin/python\r", ...)。]
マークプロトニック

回答:


36

エラー:「No such file or directory」(コロンの前に何も表示されない)が表示される場合、シバン行の末尾に改行があることを意味します。行区切り記号)。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の行末(メモ帳よりも脳死の少ないもの)に対応するエディターを使用し、Unixファイルの編集時にUnixの行末(つまりLFのみ)を書き込むように構成してください。


私はこの問題に遭遇しましたが、それは常に^M最後にあります。私はここのUbuntuだけにいますが、それでもgeditは時々^ Mを入れるので、Geanyに行きました。とにかく、別のエラーが発生しますが、それは私が見ているエラーではありません。
jcollum

1
@jcollum ^Mは、CRと言う別の方法です。
ジル「SO-悪であるのをやめる」

はい、私はそれを理解していますが、私が言っていることは、私はもはやそのエラーを受け取っていないということですので、改行の問題ではありません。
jcollum

@jcollum shebang行を編集したときにCRを削除しました。あなたが戻ってそれを変更した場合#!/usr/bin/env python(CRバック追加せずに)、それが動作します。
ジル '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.