我遇到一个问题,当我通过 FTP 将 Python 文件传输到我的 VPS 并尝试使用它运行时,./foo.py
我返回了错误:: No such file or directory
。
该错误似乎表明我尝试执行的文件不存在。但我可以毫无问题地运行该程序,python foo.py
这让我相信该错误实际上可能意味着其他内容。
起初我以为这可能是shebang线路的问题,所以我复制了该文件的所有内容并将其粘贴到VPS上尚未通过FTP传输的新文件中。这两个文件具有完全相同的内容,但是当我使用它运行新文件时,./bar.py
它按预期运行。
所以我得出的结论是,这可能是传输方式的问题。我已在 ASCII 和二进制之间切换,但这两种传输方法都会出现相同的错误。
有可能阻止这种情况发生吗?
答案1
当文件包含\r\n
作为行终止符而不是 时\n
,会发生这种情况,因为\r
是C0控制码意思是“转到当前行的开头”。
要修复,请运行dos2unix foo.py
.
会话示例:
ben@joyplim /tmp/cr % echo '#!/usr/bin/env python' > foo.py
ben@joyplim /tmp/cr % chmod +x foo.py
ben@joyplim /tmp/cr % ./foo.py
ben@joyplim /tmp/cr % unix2dos foo.py
unix2dos: converting file foo.py to DOS format ...
ben@joyplim /tmp/cr % ./foo.py
: No such file or directory
ben@joyplim /tmp/cr % ./foo.py 2>&1 | xxd
0000000: 2f75 7372 2f62 696e 2f65 6e76 3a20 7079 /usr/bin/env: py
0000010: 7468 6f6e 0d3a 204e 6f20 7375 6368 2066 thon.: No such f
0000020: 696c 6520 6f72 2064 6972 6563 746f 7279 ile or directory
0000030: 0a .
特别注意0d3a
输出中的 。
答案2
会不会是文件权限问题?
$ chmod +x foo.py
如果您没有明确表示您希望保留,那么它们会被大多数 ftp 客户端删除/更改。