2017-08-15 9 views
3

私はPythonプログラムからbashスクリプトを実行したい。スクリプトは、このようなコマンドがあります。Pythonでこのシェルスクリプトを実行するにはどうすればよいですか?

find . -type d -exec bash -c 'cd "$0" && gunzip -c *.gz | cut -f 3 >> ../mydoc.txt' {} \; 

を通常、私は次のようにサブプロセスの呼び出しを実行します:

subprocess.call('ls | wc -l', shell=True) 

しかし、それがために引用記号のここでのことはできません。助言がありますか?

ありがとうございます!

+5

''でマークをエスケープできますか? – ifconfig

+0

うわー。それは実際に動作します。他のコマンドが各サブディレクトリに入っているので動作しないと思った。ありがとう! – 0x1

+0

pythonでsubprocess.check \ _output()に '(一重引用符)または "(二重引用符)を使用できないのはなぜですか?](https://stackoverflow.com/questions/22224800/why-are-single -quote-or-double-quote-not-allowed-in-subprocess-check-outpu) – agtoever

答えて

3

のマークを\でエスケープします。すべてのためにすなわち

'、と交換してください:\'

2

トリプル引用符や三重の二重引用符(「」「いくつかの文字列」「」または「」「いくつかの他の文字列は」「」)にも便利です。質問が既に回答されている間、私はあなたがいるのでそのbashスクリプトを実行したいと仮定しているため、私はまだ中にジャンプしますhere(ええ、そののpython3のドキュメントが、それはすべてpython2で100%動作します)

mystring = """how many 'cakes' can you "deliver"?""" 
print(mystring) 
how many 'cakes' can you "deliver"? 
4

を参照してください。機能的に等価なPythonコード(基本的に40行以上のリースはありません、以下を参照)がありません。 これはなぜbashスクリプトですか?

  • あなたのスクリプトがPythonインタプリタを持っている任意のOS上で実行することができます
  • 機能が読んで、あなたが何か特別なことが必要な場合、常に適応しやすい
  • を理解することは非常に簡単です、あなたの

:-)独自のコード

  • よりPython的なエラーチェックと出力ファイルの任意の種類なし(あなたのbashスクリプトとして)である心に留めてくださいは、グローバル変数であるが、それは簡単に変更することができます。

    import gzip 
    import os 
    
    # create out output file 
    outfile = open('/tmp/output.txt', mode='w', encoding='utf-8') 
    
    def process_line(line): 
        """ 
        get the third column (delimiter is tab char) and write to output file 
        """ 
        columns = line.split('\t') 
        if len(columns) > 3: 
         outfile.write(columns[3] + '\n') 
    
    def process_zipfile(filename): 
        """ 
        read zip file content (we assume text) and split into lines for processing 
        """ 
        print('Reading {0} ...'.format(filename)) 
        with gzip.open(filename, mode='rb') as f: 
         lines = f.read().decode('utf-8').split('\n') 
         for line in lines: 
          process_line(line.strip()) 
    
    
    def process_directory(dirtuple): 
        """ 
        loop thru the list of files in that directory and process any .gz file 
        """ 
        print('Processing {0} ...'.format(dirtuple[0])) 
        for filename in dirtuple[2]: 
         if filename.endswith('.gz'): 
          process_zipfile(os.path.join(dirtuple[0], filename)) 
    
    # walk the directory tree from current directory downward 
    for dirtuple in os.walk('.'): 
        process_directory(dirtuple) 
    
    outfile.close() 
    
  • 関連する問題