在第一行中有#!/ usr / bin / env python`时,脚本可能无法找到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脚本。但是当我运行它时,我得到“没有这样的文件”。

我可以通过将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跑了几百行输出,特别是什么?
jcollum

: No such file or directory在输出之前发出的任何包含尝试执行的行。[编辑:刚看到吉尔斯的回答。检查strace输出中看起来像的行execve("/usr/bin/python\r", ...)。]
Mark Plotnick

Answers:


36

如果看到错误“:没有这样的文件或目录”(冒号前没有任何内容),则表示您的shebang行的末尾有回车符,可能是因为它是在Windows(使用CR,LF作为行分隔符)。在外壳打印消息的开头之后,CR字符会导致光标移回到行的开头,因此您只能看到CR后面的部分,该部分结束了错误消息中的解释器字符串。

删除CR:shebang行需要以Unix 行结尾(仅换)。Python本身允许CRLF行结尾,因此其他行上的CR字符不会受到伤害。另一方面,Shell脚本必须没有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的另一种方式。
吉尔斯(Gilles)'所以

是的,我了解这一点,但是我要说的是,我不再遇到该错误,所以这不是换行问题。
jcollum

@jcollum编辑shebang行时,您删除了CR。如果将其更改回#!/usr/bin/env python(不添加回CR),它将起作用。
吉尔(Gilles)'所以

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之间即时切换,此问题已解决。我不确定这是否适用,但是如果您在文本编辑器中进行编程,则可以通过提供一个切换按钮来提供简单的答案。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.