2017-01-03 3 views
0

ファイルを開いているかどうかを監視しながらファイルの基本的なオープンを試みているだけですが、ファイルを開いて終了します。それがなぜ起こるのかについての示唆はありますか?ファイルをサブプロセスとして開く

class Opener: 
    def __init__(self, file_path): 
     self.file_path = file_path 
     self.process = None 

    def start(self): 
     sub = subprocess.Popen(self.file_path, shell=True) 
     while sub.poll(): 
      pass 
     print "closed" 
new = Opener("test.jpg") 
t1 = threading.Thread(target=new.start) 
t1.start() 
+1

'Popen'は実行ファイルをパラメータであり、画像ではありません。あなたは何を達成したいですか? –

+0

コマンドラインのようにパラメータを実行するシェル引数を使用しました。画像を開く必要がありますが、閉じられるまで待機します。 –

+0

WindowsまたはLinuxを使用していますか? –

答えて

0

shell=TrueとWindows上でのみ動作拡張用のデフォルトのプログラムは、指定されたファイルを開くために使用されているので、それは問題が

ということです cmd /c Path\To\File

を使用するのと同じです:このような何か

while sub.poll(): 
    pass 

あなたが望むものはありません。 sub.poll()は、プログラムが実行されている間にNoneを返し、終了するとプログラムの終了コードを返します。プログラムがこのループに到達する前に0以外の終了コードで終了する場合、ループ処理を継続してCPUを消費します。プログラムがまだ実行中または正常に完了している場合、ループはまったく入力されません。

poll()を使用してプロセスがまだ実行中であることを確認するには、sub.poll() is Noneをチェックするか、sub.wait()を使用してください。

ただし、2つ目のインスタンスを起動しようとすると、開いているウィンドウでファイルを開き直ちに終了するプログラムもあります。その場合、ファイルがまだアプリケーションで開いていることを知る簡単な方法はありません。したがって、動作は登録されたプログラムにも依存します。

0

subprocess.Popenを使用してファイルを開くことはできません。 documentationにあるように、新しいプロセスで子プログラムを実行するために使用されます。あなたが読書のためのファイルを開きたい場合でも、

with open(self.file_path, 'r') as f: 
    # do somethin here 
    pass 

は、ファイルがwith文の初めに開かれ、その後閉じられますか。

+0

私はそれが閉じているかどうかをチェックしようとしているだけでなく、内容を読む。私はまた、Windows上でデフォルトプログラムを起動しようとしているので、シェルから実行する必要があります。 –

+0

次に、http://stackoverflow.com/questions/6825994/check-if-a-fileを見てください。 -is-open-in-python – MrLeeh

0

Popenは、開いているファイルではなく、新しいプロセスを作成する(Pythonスクリプトから別のプログラムを実行する場合など)ためのものです。

t1 = multiprocessing.Process(target=new.start) 

と変更機能Opener.startので、それがファイルを開くと、それについて尋ねます:あなたは代わりの

t1 = threading.Thread(target=new.start) 

使用、異なるプロセスでファイルを開く機能を実行するためにmutiprocessingモジュールを使用することができます状態。

def start(self): 
    sub = open(self.file_path) 
    while not sub.closed: 
     pass 
    print "closed" 
関連する問題