Python脚本出现“:没有这个文件或目录”错误

48

我有几个Python脚本都能正常工作,但其中一个脚本(从今天早上开始)在bash中运行时会出现以下错误:

: 没有那个文件或目录

如果我通过python script_name.py运行此'损坏'的脚本,它是可以正常运行的。在查找了一番后,我大致猜测可能是因为哈希标志的行尾符被更改了(悄悄地),所以我通过VI中的:set list选项查看了一个工作的脚本和一个损坏的脚本的行尾符,就像在这个问题中所指示的那样 -> 查看文本文件中的行尾符

两个文件的行尾都使用相同的字符(一个$),所以我不知道该如何继续。具体来说,如果set list不是正确的方法,我该如何“查看”行尾符。

PS:该脚本是可执行的,并且已经包含了shebang,在周末之前它一直可以正常工作,但今天早上开始就出现了这个错误。

-- 编辑:--

通过dos2unix运行此脚本确实可以让它正常工作,但我想知道是否有一种方法可以在VI(M)中可视化行尾符或为什么Geany首先将行尾符转换了(因为我从未在dos / windows系统上工作过)。


你是如何运行它的?难道你忘记了shebang吗? - Ciro Santilli OurBigBook.com
1
如果文件是ASCII文本可执行文件,并且使用CRLF行终止符,则需要使用dos2unix命令转换文件。要运行脚本,请键入“file script_name.py”。 - vahid abdi
1
我有一个简单的打印语句作为代码的第一行,紧接着是一个立即退出。代码本身不是问题,我只是说我可以通过调用python scriptname.py来成功运行它,但不能通过./scriptname.py来运行,而且它是可执行的。 - Bas Jansen
2
@InbarRose “sudo chmod 0777 filename” 永远不是 答案。 - Burhan Khalid
2
要查看行结束符样式,请使用vim命令:set fileformat或简写为:set ff。它将显示dosunix。您可以使用:w ++ff = unix或者:set ff=unix并正常保存文件来进行转换。 - rodrigo
显示剩余10条评论
4个回答

68

从上面的评论中可以看出,您使用的是DOS行尾符,因此哈希行未被正确处理。

Vim中使用:set list选项不会显示行尾样式,因为该选项仅在读/写文件时使用。在内存中,换行符始终是换行符。用于文件的行尾样式保存在Vim每个文件的选项中,奇怪地称为fileformat

要从Vim中查看/更改行尾样式,可以使用以下命令:

:set fileformat
:set ff

它将显示dosunix。你当然想要unix ;-).

要快速更改它,可以使用以下方法保存文件:

:w ++ff=unix

或者如果您更喜欢:

:set ff=unix

然后正常保存文件。

如果想查看所有细节,请输入:help fileformat:help file-formats:help fileformats


帮了我很多!谢谢。 - regetskcob

10

您还可以使用dos2unix命令来转换文件格式。

dos2unix

这对我运行python脚本很有帮助。

这通常发生在我们在Windows中打开文件进行更改并保存时。 如果您打开文件,请定位每行末尾的^M字符。

谢谢


1
这绝对不是对问题的回答。你的答案甚至在我提问中已经明确提到了。 - Bas Jansen

3

个人而言,我认为直接使用Python解释器的路径是不太恰当的。由于您不使用Windows平台,因此您应该具有程序环境,通常在/usr/bin (/usr/bin/env)中。尝试使用以下shebang:

#!/usr/bin/env python

不同的Linux发行版会将Python二进制文件存储在/bin或/usr/bin(或其他一些奇怪的位置),而这种方式可以使您的脚本与配置无关(尽可能地,这里有可能环境变量被存储在其他位置;但仍然较不可能环境变量不在/usr/bin中,而Python则位置错误)。
我曾经遇到类似的问题(如果不是完全一样),这种方法对我有效。
此外,我安装了两个Python解释器(2.7.x和3.x),因此我需要使用“python3”参数来指定环境。据我所知,通常发行版将不同的名称链接到不同的二进制文件上,“env python”将在我的系统上运行Python2.7,“env python3”(也可能是python33或类似名称)将运行p3k,“env python2”(也可能是python27等)将运行Python 2.7.x。声明应使用哪个版本的解释器似乎也是一个好主意。

被踩:行的结尾是问题的起因,而不是这个。这是没有根据的编辑工作。 - Dan H
我其实同意 - 事后我明白这不是一个充分的答案,但我不想删除或编辑它只是为了重复别人的答案。虽然我不会把它称为编辑,而更像是一个错误的猜测,但这不是重点。 - Filip Malczak

2
我发现在Windows上编辑代码,使用git进行检查,然后在Linux上检出和运行时遇到了问题。
我的解决方案是:告诉git去做正确的事情。我在Windows命令行中输入以下命令:
git config --global core.autocrlf true

修改了文件并将其检入;哇,再也没有这样的问题了。

如Git文档所讨论的那样:处理换行符


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接