web-dev-qa-db-ja.com

Pythonスクリプトは `:No such file or directory`を与える

私はいくつかのpythonスクリプトはうまく動作しますが、bashから実行しようとすると1つのスクリプトが(今朝の時点で)私にこのエラーを与え始めました:

: そのようなファイル、又はディレクトリはありません

python script_name.pyを実行することで「壊れた」スクリプトを実行できます。少し調べた後、ハッシュバンの末尾の行が(サイレントに)変更された可能性があるので、行を確認しました。この質問に示されているように、VIの:set listオプションを使用した作業スクリプトと破損スクリプトの終了-> テキストファイルの行末を表示

両方のファイルが同じ文字($)を使用して終了しているように見えるため、ここから先に進む方法について少し迷っています。具体的には、set listが適切な方法ではなかった場合に実際に行末を「見る」方法。

PS:スクリプトは実行可能で、Shebangはそこにあります。週末までに正常に機能していたのはこの1つのスクリプトだけでしたが、今朝からこのエラーが発生し始めたと述べました。

-編集:-

dos2unixを介してスクリプトを実行すると再び機能しますが、VI(M)で行末を何らかの方法で視覚化する方法、またはGeanyが最初に行末を何らかの方法で変換した理由を知りたいとにかくDOS/Windowsシステムで動作します)。

38
Bas Jansen

上記のコメントから、dos行の終わりがあるように見えるため、hashbang行は適切に処理されません。

行末スタイルは、Vimでは:set listで表示されません。これは、このオプションがファイルの読み取り/書き込み時にのみ使用されるためです。メモリでは、行末は常に行末です。ファイルに使用される行末スタイルは、奇妙なことにfileformatと呼ばれるVimのファイルごとのオプションに保持されます。

Vimの行末スタイルを表示/変更するには、次のコマンドを使用できます。

:set fileformat
:set ff

dosまたはunixが表示されます。もちろんunixが必要です;-)。

すばやく変更するには、次の方法でファイルを保存できます。

:w ++ff=unix

または、必要に応じて:

:set ff=unix

そして、通常どおりファイルを保存します。

:help fileformat:help file-formats、および:help fileformatsを実行するだけで、すべての面倒な詳細を確認できます

59
rodrigo

Dos2unixコマンドを使用してファイル形式を変換することもできます

dos2unix

これはpythonスクリプトを実行するのに役立ちました

これは通常、Windowsでファイルを開いて変更を加えて保存するときに発生します。ファイルを開くと、すべての行の最後に^ M文字があります

ありがとう

7

個人的には、pythonインタープリターへの直接パスを使用すると、ちょっと間違っています。 Windowsプラットフォームを使用しないので、通常は/ usr/bin(/ usr/bin/env)にあるプログラムenvが必要です。次のShebangを使用してみてください。

#!/usr/bin/env python

異なるディストリビューションは、pythonバイナリを/ binまたは/ usr/bin(またはいくつかの奇妙な場所)に保存します。これにより、スクリプトは設定に依存しなくなります(可能な限り、envは別の場所に保存される可能性があります。 -envがpythonの位置が間違っているよりも/ usr/binにない可能性は低いです)。

(まったく同じではないにしても)同様の問題があり、それは私にとってはうまくいきました。

また、両方のpythonインタープリター(2.7.xおよび3.x)がインストールされているため、envに「python3」引数を使用する必要があります。 AFAIRは通常、異なる名前を異なるバイナリにリンクするため、「env python」はシステム上でpython2.7を実行し、「env python3」(python33、またはそのようなsmth)はp3kを実行し、「env python2」(python27、など)python 2.7.xを実行します。使用するインタープリターのバージョンを宣言することも良い考えのようです。

4
Filip Malczak

Windowsでコードを編集し、gitでコードをチェックインし、Linuxでコードをチェックアウトして実行すると、この問題に遭遇しました。

私の解決策は、Do The Right Thingをgitに伝えることでした。 Windowsボックスでこのコマンドを発行しました。

git config --global core.autocrlf true

ファイルを変更してチェックインしました。出来上がり、そのような問題はもうありません。

Gitドキュメント で説明したとおり。

2
Dan H