Python実行可能ファイルを実行しようとすると、FTP経由でサーバーに送信された後、「:そのファイルまたはディレクトリがありません」が返されるのはなぜですか? [コピー]

Python実行可能ファイルを実行しようとすると、FTP経由でサーバーに送信された後、「:そのファイルまたはディレクトリがありません」が返されるのはなぜですか? [コピー]

FTP経由でPythonファイルをVPSに転送して実行しようとすると、次の./foo.pyエラーが返される問題が発生しました: No such file or directory

エラーは、実行しようとしているファイルが存在しないことを示すようです。ただし、問題なくプログラムを実行できるため、python foo.pyエラーが実際に異なる意味を持つ可能性があると信じています。

最初はシャバンラインの問題かもしれないと思い、ファイルの内容をすべてコピーし、まだFTP経由で転送していないVPSの新しいファイルに貼り付けました。どちらのファイルも同じ内容ですが、新しいファイルを実行すると./bar.py期待どおりに実行されます。

それで、伝送方式に問題があるかもしれないという結論を下しました。 ASCIIとバイナリを切り替えましたが、両方の転送方法で同じエラーが発生します。

このような事態を防ぐことは可能ですか?

答え1

これは、ファイルに\r\n行終端が含まれている場合に発生します。\n\rC0 制御コードこれは、「現在行の先頭に移動」を意味します。

問題を解決するには、を実行してください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クライアントによって削除/変更されます。

関連情報