Subprocess.call() と gunzip エラー

Subprocess.call() と gunzip エラー

Pythonのパッケージサブプロセスを使用してファイルを圧縮してgzipしようとしています。次のコマンドを使用しています。

subprocess.call(['gunzip', a_path+myfile_gz], shell=True)

その後、エラーメッセージが表示されます。

gzip:圧縮データを端末から読み取ることができません。強制的に解凍するには、-fを使用してください。

だから私は次のように入力します:

subprocess.call(['gunzip', '-f', a_path+myfile_gz], shell=True)

同じエラーメッセージが表示されます。と入力するとshell=False悪くなります。

端末でこれを行うと正常に動作するため、これは本当に奇妙です!何が間違っているのか知っている人はいますか?

答え1

問題は、あなたが合格しているということですshell=True。だからあなたは実行しています

sh -c gunzip /path/to/file.gz

a_path+myfile_gzと仮定"/path/to/file.gz")。つまり、shell引数はそのため、Trueコマンドリストの最初の要素はシェルフラグメントであり、他の引数はそのシェルフラグメントの引数です(ここでは$0)。これは文書

省略するとshell=True動作しますが、良いコードではありません。パス内の文字列を扱わないでください。os.path。おそらくそうa_path+myfile_gzする必要がありますos.path.join(a_path, myfile_gz)

それにもかかわらず、Pythonには以下をサポートする機能が組み込まれています。アーカイブ。外部コマンドを使用しないでください。

関連情報