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には以下をサポートする機能が組み込まれています。アーカイブ。外部コマンドを使用しないでください。