2017-01-03 60 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

我用shell參數運行參數,就像在命令行中一樣,它會像打開圖片一樣,但它會一直等到它關閉爲止 –

+0

您使用的是Windows還是Linux? –

回答

0

在Windows上這僅適用於shell=True因爲該擴展名的默認程序來打開指定的文件,它的使用cmd /c Path\To\File

的問題相當於是

while sub.poll(): 
    pass 

不是你想要的。 sub.poll()在程序運行時返回None,程序結束時退出代碼。如果程序在到達該循環之前以0以外的退出代碼終止,那麼它將保持循環並消耗CPU。如果程序仍在運行或已成功完成,則循環根本不會輸入。

檢查是否仍在使用poll()正在運行的過程應通過檢查sub.poll() is None或更好地使用sub.wait()來完成。

然而,有些程序只允許一個活動實例,如果您嘗試啓動第二個實例,它將在打開的窗口中打開該文件並立即退出。在這種情況下,沒有簡單的方法可以知道該文件是否仍在應用程序中打開。所以這種行爲還取決於註冊程序。

0

請勿使用subprocess.Popen來打開文件。正如您在documentation中看到的,它用於在新過程中運行子程序。但是,如果你想打開一個文件進行讀做

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

該文件將在with語句開頭開,之後關閉。

+0

我正在嘗試檢查它是否關閉,不僅閱讀內容。我也試圖通過Windows上的默認程序來啓動它,所以我將不得不從shell運行它 –

+0

然後,你應該看看http://stackoverflow.com/questions/6825994/check-if-a-file -is開放式的Python – MrLeeh

0

Popen是爲了創建新的進程(如在,從您的python腳本執行另一個程序),而不是打開的文件。您可以使用mutiprocessing模塊執行打開在不同的進程文件的功能,而不是

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

使用:

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

和更改功能Opener.start所以它會打開一個文件,並詢問它的州。事情是這樣的:

def start(self): 
    sub = open(self.file_path) 
    while not sub.closed: 
     pass 
    print "closed" 
相關問題