dos和unix中的python文件

dos和unix中的python文件,python,linux,Python,Linux,我在windows中有一些python文件,我通过samba将它们传输到我的gentoo 我检查他们的模式是否可执行,并使用/xxx.py运行该模式,但出现错误: :没有这样的文件或目录 我很不安,它没有提示什么文件不在这里 但是当我使用pythonxxx.py时,它可以以正确的方式运行 然后我在vim中使用set ff检查CR字符,发现它是dos,然后我使用set ff=unix设置它,现在它可以使用/xxx.py运行 但是我不知道当ff=dos时为什么可以使用pythonxxx.py?Win

我在
windows
中有一些python文件,我通过samba将它们传输到我的
gentoo

我检查他们的模式是否可执行,并使用
/xxx.py
运行该模式,但出现错误:

:没有这样的文件或目录

我很不安,它没有提示什么文件不在这里

但是当我使用
pythonxxx.py
时,它可以以正确的方式运行

然后我在vim中使用
set ff
检查CR字符,发现它是
dos
,然后我使用
set ff=unix
设置它,现在它可以使用
/xxx.py
运行


但是我不知道当
ff=dos
时为什么可以使用
pythonxxx.py

Windows行尾是CRLF,或者
\r\n

Unix只使用
\n

当操作系统读取您的shebang行时,它会看到
#/usr/bin/python\r
。它无法运行此命令

从unix shell中查看此行为的一种简单方法是
$(echo-e'python\r')
(它尝试作为命令运行
python\r
)。此输出也将类似于
:未找到命令


Windows下的许多高级代码编辑器都支持使用unix行尾进行本机保存。

Windows行尾是CRLF,或
\r\n

Unix只使用
\n

当操作系统读取您的shebang行时,它会看到
#/usr/bin/python\r
。它无法运行此命令

从unix shell中查看此行为的一种简单方法是
$(echo-e'python\r')
(它尝试作为命令运行
python\r
)。此输出也将类似于
:未找到命令


Windows下的许多高级代码编辑器都支持以unix行结尾进行本机保存。

DOS文件以CR+LF结尾行,unix文件仅以LF结尾。这意味着,当Unix读取文件以确定可执行文件的名称时,该可执行文件的名称以CR结尾。如下所示:

#!/usr/bin/python

print("Blah!")
当我跑步时,我得到:

$ ./test.py 
bash: ./test.py: /usr/bin/python^M: bad interpreter: No such file or directory
在您的情况下,CR字符(上面的^M)不会打印出来,而是由终端“执行”,即光标将返回到行的开头。因此,^M之前的所有内容都将被覆盖:

$ ./test.py 
:错误的解释器:没有这样的文件或目录

这就是为什么在Unix上无法执行DOS文件结尾的文件


任何远程现代源代码控制系统都会为您处理此问题,并在您签出源代码时更改文件结尾。

DOS文件以CR+LF结尾,Unix文件以LF结尾。这意味着,当Unix读取文件以确定可执行文件的名称时,该可执行文件的名称以CR结尾。如下所示:

#!/usr/bin/python

print("Blah!")
当我跑步时,我得到:

$ ./test.py 
bash: ./test.py: /usr/bin/python^M: bad interpreter: No such file or directory
在您的情况下,CR字符(上面的^M)不会打印出来,而是由终端“执行”,即光标将返回到行的开头。因此,^M之前的所有内容都将被覆盖:

$ ./test.py 
:错误的解释器:没有这样的文件或目录

这就是为什么在Unix上无法执行DOS文件结尾的文件


任何远程现代源代码管理系统都会为您处理此问题,并在您签出源代码时更改文件结尾。

并非所有源代码管理系统都会自动损坏您的行结尾。例如,我知道git要求你打开
autocrlf
,如果你想要这个功能的话。不是所有的源代码管理系统都会自动损坏你的行尾。例如,我知道git要求您启用
autocrlf
,如果您需要此功能。