2017-12-29 26 views
2
import subprocess 
import os 

#files 
src_file = '/../copy_me_test.txt' 
destination_file = 'paste_here.txt' 

#make copy of file 
shell_command = 'cp "%s" "%s"' % (src_file, destination_file) 
successful = subprocess.call(shell_command, shell = True) 
print(successful) 

私は1つのディレクトリから別のディレクトリにファイルをコピーしています。私がsubprocess.call()メソッドを実行すると、それは1を返します。何も起こらず、私の端末に次のメッセージが表示されます。エラーPythonサブプロセス呼び出しコピーファイル。ファイルはありません。失敗しますが、1を返します。なぜですか?

cp: /Users/my_name/Desktop/python/copy_files/copy_me_test.txt: No such file or directory 
1 

ここでは何が起こっていますか?これは、ファイルのコピーを作成できなかったので、0を返してはいけません。私はすでに仕事をしましたが、なぜこれが起こっているのか誰もが知っているかどうか知りたいのですが?どんな情報やリンクも高く評価されます。

+0

サイドノート:シェルプログラムを使用しないでください。 Python内から直接これを行うには、['shutil.copyfile'とfriends(https://docs.python.org/3/library/shutil.html#shutil.copyfile)を見てください。エラーチェック/携帯以外の外部プログラムの使用。 – ShadowRanger

+0

私はそれをします。私はPythonには新しいので、アドバイスをいただければ幸いです。私はあなたが「壊れやすい/エラーチェックが難しい/外付けの外部プログラムの使い方がない」ということを本当に理解していません。 –

+1

実行可能ファイルをサブプロセスとして呼び出すときに、Pythonで例外をキャッチする代わりに、戻りコードを取得して、それをif-elseラダーの既知のエラーコードと比較する必要があります。これは使いにくいものです。エラーコードは、スクリプトが実行されているプラ​​ットフォームによって異なる場合があり、移植できない可能性があります。また、実行可能ファイルの新しいバージョンでリターンコードが変更され、脆弱になることがあります。 – JacaByte

答えて

1

それが失敗したときに、ここでのドキュメントhttps://docs.python.org/2/library/subprocess.htmlによると、それはあなたが属性シェルを使用している場合、警告があることを確認してくださいまた、1を返します= Trueの

+0

ありがとうございます。それはチェックアウトする。ドキュメントはちょっと混乱しましたが、私はプログラムを数回走らせました。その結果は、あなたが言ったことと一貫していました。私はチュートリアルに従っていた。私はそれを誤解しているに違いない。再度、感謝します。 –

+0

@EmmanuelCodev問題ありません! 1つの答えを受け入れることを忘れないでください!チェックボックスはhttps://i.stack.imgur.com/uqJeW.png –

1

戻り0は成功です。 0ではありません。リターンコードは、0〜4294967295の32ビット整数です。オペレーティングシステムに基づいてExit statusを見てください。

Python 3 docsが確認したときに、負の戻りコードが設定または受信されることがあります。

Popen.returncode

子戻りコード、ポーリングによって設定()及び(待機)(間接的で通信())。 None値は、プロセスがまだ終了していないことを示します。

負の値-Nは、子がシグナルNで終了したことを示します(POSIXのみ)。

exit(-1)で終了すると、Windowsでは4294967295になります。したがって、Pythonでは符号なし32ビットのリターンコードが使用されます。

+0

はい。私は戻り値の意味を誤解してしまったことを認識しました。それを私にもっと詳しく説明してくれてありがとう。私は今、成功のためのマーカーとして0が使われる理由を見ています。 –

関連する問題