2011-04-06 20 views
9

'u öldürmeye çalışırken erişim engellendi. Bu nedenle, bir program A'yı alt işlem aracılığıyla çağıran bir döngü çalıştıran bir python betiğim var.Popen, çıkışını bekledikten sonra kaydeder. çıktı ve daha sonra tekrar arar. (Bu, giriş olarak ayarladığım bir dizi çalışma için geçerli olmaya devam ediyor)WindowsError: [Hata 5] Bir alt işlem (python)

Programın A, belirli bir eşik değerden daha fazla alması durumunda, betiğin process.kill ile işlemi sonlandırması için bir zamanlayıcım var.) ve sonraki iterasyona geçer.

File "C:\Python27\lib\subprocess.py", line 1002, in terminate 
    _subprocess.TerminateProcess(self._handle, 1) 
    WindowsError: [Error 5] Access is denied 

ve ardından komut ölür:

sorun her şey hatta 300 ishal için çok iyi çalışıyor görünüyor olsa da, bazen bu hatayı alıyorum olmasıdır.

sevk komut kısmı:

timeout = TIME_CONST 
for run in runs: 
    killed = False 
    start = time.clock() 
    p = subprocess.Popen("SOME.CMD", cwd=r"some_dir") 
    # Monitor process. If it hits threshold, kill it and go to the next run 
    while p.poll() is None: 
     time.sleep(20) 
     secs_passed = time.clock() - start 

     ### the following was my initial buggy line ### 
     #if secs_passed >= timeout: 

     ### corrected line after jedislight's answer ### 
     #if the time is over the threshold and process is still running, kill it 
     if secs_passed >= timeout and p.poll is None: 
      p.kill() 
      killed = True 
      break 
    if killed: continue 

sorunun ne olabileceği hakkında bir öneriniz var mı?

EDIT: Kabul edilen yanıt ve kodu düzeltin. Teşekkürler @jedislight geri bildiriminiz için!

+0

Bu davranışı yeniden oluşturabilecek en küçük Python komut dosyasını gönderir misiniz? –

+0

@Sridhar İstediğiniz kodu ekledim. – Galois

+0

Sadece "cmd" olan "SOME.CMD" ile denedim ve çalıştı. Senin öldürmeye çalıştığın sürecin nedir? – Fenikso

cevap

6

p.poll() ve p.kill() öğelerinizi 20 saniye kadar ayırıyorsunuz. O zamana kadar süreç bitmiş olabilirdi. Ölü bir süreci öldürmekten kaçınmak için, aynı zaman diliminde yoklamanızı ve öldürmenizi sağlayan time.sleep (20) çağrısı yapmayı öneririm. Aşağıda tamamlanmış bir süreç öldürme zaman benzer bir hatayı gösteren ipython çalıştırmak bir örnek:

In [2]: import subprocess 

In [3]: p = subprocess.Popen("dir") 

In [4]: p.poll() 
Out[4]: 0 

In [5]: p.kill() 
--------------------------------------------------------------------------- 
WindowsError        Traceback (most recent call last) 

C:\Users\---\<ipython console> in <module>() 

C:\Python26\lib\subprocess.pyc in terminate(self) 
    947    """Terminates the process 
    948    """ 
--> 949    _subprocess.TerminateProcess(self._handle, 1) 
    950 
    951   kill = terminate 

WindowsError: [Error 5] Access is denied 

sonraki satırı çalıştırılmadan önce bitirebiliriz çalıştıran süreçleri gösteren bir anket hemen sonra öldürmek bile. Bu istisna için bir try-catch bloğu eklemenizi ve işlemin gerçekten tamamlanıp tamamlanmadığını görmek için tekrar anket yapılmasını öneririm.

+0

Sanırım haklısınız. O bölümü özledim. Fark ettiğin için teşekkürler! – Galois

+0

Bir mp3 dosyasını okumaya çalışırken librosa/audioread paketi ile benzer bir sorun yaşıyorum. Ama maalesef, deneme avcısı benim için çalışmıyor –

İlgili konular