2016-03-19 10 views
-1

メインディレクトリに複数のサブディレクトリとそれらのサブディレクトリの名前を含むテキストファイル(test.txt)があります。私のコードはメインディレクトリのtest.txtファイルから各ディレクトリの名前を読み込み、各サブディレクトリに "gmx mdrun ..."プログラムを実行する必要があります。それをどうすれば実現できますか?私のコードとtest.txtは以下の通りです。私のコードは以下のエラーを出します。そのエラーに加えて、私のコードは各サブディレクトリの名前を取得しないと思いますか?ディレクトリのリストを含むファイルをループして、それぞれのコマンドをPythonで実行する方法

エラー:

Traceback (most recent call last): File "./read.py", line 11, in os.chdir(path/line) TypeError: unsupported operand type(s) for /: 'str' and 'str'

あるtest.txt:

metan-1

ethanol

1-2-benzene

...

#!/usr/bin/python 

import os 
path=os.getcwd() 


with open("test.txt", "r") as f: 
    array = [] 
    for line in f: 
     array.append(line) 
os.chdir(path/line) 
os.system("gmx mdrun -v -deffnm md") 
os.chdir('..') 

f.close() 
+2

あなたは、空白とインデントが、Pythonスクリプトがどのように解釈され、正しく実行されるのかが重要であることを認識していますか? –

+0

あなたの質問は不適切です。 'os.system(" gmx mdrun -v -deffnm md ")の先頭にあるスペースを削除してください。 –

+0

問題はまさにエラーの内容です。 'os.system(...) 'の前に空白を入れないでください – zondo

答えて

2

閉じるが、あなたはより多くのような何かを探している:

#!/usr/bin/python 

import os 
path=os.getcwd() 

COMMAND='gmx mdrun -v -deffnm md' 

with open("test.txt", "r") as f: 
    for line in f: 
     os.chdir(line.strip()) 
     os.system(COMMAND) 
     os.chdir('..') 

顕著な変化がある:緩衝液として配列を使用することが不要となるように

  • は、入力ファイルをループ内os.system実行を移動改行文字を削除するためにライン上.stripを用い
  • (オプション)コマンドを定数に設定すると、with文でオープンされたファイルは暗黙的にクローズされるため、f.close()は不要です。

EDIT:エラーに対処

パスは/ラインは相対的であるので、os.chdirスクリプトが実行され、同じ場所にディレクトリ相対に移動しようとしている(また、比較的アクセス) test.txtが存在します。

EDIT:それは、その使用は文書化され、再利用可能だし、それは特定のユースケースのためにハードコードいない

#!/usr/bin/env python 

import argparse 
import os 
import sys 
from subprocess import call 


COMMAND='gmx mdrun -v -deffnm md' 
DIRECTORY_FILE='test.txt' 

def main(directory_file=DIRECTORY_FILE, command=COMMAND): 
    with directory_file: 
     for line in directory_file: 
      os.chdir(line.strip()) 
      call(command.split()) 
      os.chdir(os.pardir) 

def parse_args(): 
    parser = argparse.ArgumentParser(description='Execute commands on a list of directories.') 
    parser.add_argument('--command', 
         '-c', 
         type=str, 
         default=COMMAND, 
         help='the command to be run') 
    parser.add_argument('--directory-file', 
         type=argparse.FileType('r'), 
         default=DIRECTORY_FILE, 
         help='a file containing a list of directories to run the command on') 

    return parser.parse_args() 


if __name__ == '__main__': 
    args = parse_args() 
    main(args.directory_file, args.command) 

:完全性については

として、私はこのスクリプトを書いているだろう。

+1

これを使用するのが安全で適切な方法はos.systemではなくsubprocessing.Popenを使用することです – Julius

+0

私はそれを認識していますが、OPのコードをあまりにも大幅に変更したくはありませんでした。 – bschlueter

+1

bschlueterが述べているように、私たちは、個人的な最適化をそれぞれ追加して、ちょうど環境を作り出す被験者を深く理解する必要がない人のために答えを加えるならば、初心者は決して質問したくない、答えは意見の根拠が強すぎる – Mixone

1

答えは簡単です。Pythonは、あなたがしたいことではなく、あなたがしたいことではありません。

os.chdir(path/line) 

この行は、Pythonを語っている:

  • を私はパス
  • と呼ばれる文字列を持って、私はライン
  • と呼ばれる文字列を持っている私は、これはライン

でパスを分割あなたがしたいことではなく、あなたが書いたものです。したがって、単純な連結を使用するだけで、スラッシュ記号自体を分割し、引用符の中にスラッシュを入れます。ように:

os.chdir(path + "/" + line) 

それを解決する必要があります。

しかしあなたはそれはおそらく(ALLWAYSを参照)ので、行末文字が含まれていることを意味したファイルから行を読んでいる:これは、それがシンプルですなぜあなたは不思議に思っている場合は

os.chdir(path + "/" + line[:-1]) # So all chars in line except for last 

、chdirは文字列形式のパスを必要とするため、フルパスを形成するために必要な文字列を追加する必要があります。これを説明するためにADDINGを使用することに注目してください。それはあなたが行っていることを正確に理解し、文字列を追加して新しいものを得ることを理解することが重要です。

+0

あなたは 'os.chdir(path +"/"+ line")を提案しようとしましたが、OSError:[Errno 2]というファイルやディレクトリはありません。 '/ home/Desktop/work/metan-1 \ n ""。あなたのコマンドは、エラーからわかるように、ディレクトリpatwhayの最後に "\ n"を追加しました。 – erhan

+0

いいえ、 "\ n"文字はファイルの入力から読み取られたすべての行の最後にあります。削除することを意図しています。私は悪いことを述べません。 – Mixone

+1

だから 'os。 chdir(path + "/" + line [: - 1]) ' – Mixone

関連する問題