2011-10-07 18 views
38

Başka bir bilimsel programı çalıştırmak için kullanılan os.system() numaralı Python komut dosyasını içeren bilimsel bir yazılım kullanıyorum. altişlem çalışırken, Python bir noktada baskılar aşağıdaki:os.system() sırasında "IOError: [Errno 9] Hatalı dosya tanıtıcıya" yol açabilir?

close failed in file object destructor: 
IOError: [Errno 9] Bad file descriptor 

Bu mesajı os.system() getiriler ile aynı anda yazdırılır inanıyoruz.

Sorularım şimdi şunlardır:

hangi koşullar IOError bu tip yol açabilir? Tam olarak ne anlama geliyor? os.system() tarafından çağrılan alt işlem için ne anlama geliyor? Python dosyası "dışarıdan" gelen kapatıldı eğer

+2

Not: 'subprocess' modülü kullanılarak [tercih edilir] (http:/os.system() 'üzerinde /docs.python.org/library/os.html#os.system). –

+0

:-) Biliyorum ve bu yazılımda pek çok mükemmel olmayan şey var. –

cevap

35

Sen dosya nesnesinin close() yönteminden, yani bu hata mesajını alıyorum:

>>> f = open(".bashrc") 
>>> os.close(f.fileno()) 
>>> del f 
close failed in file object destructor: 
IOError: [Errno 9] Bad file descriptor 

hat del f neden dosya nesnesine son başvuruyu siler onun yıkıcı file.__del__ çağrılacak. Dosya nesnesinin iç durumu, dosyanın hiçbir zaman f.close() hiçbir zaman çağrılmadığı için açık olduğunu gösterir, bu nedenle yıkıcı dosyayı kapatmaya çalışır. İşletim sistemi, açık olmayan bir dosyayı kapatma girişimi nedeniyle bir hata atar.

os.system() uygulaması, herhangi bir Python dosya nesnesi oluşturmadığından, system() çağrısının hata kaynağı olması olası değildir. Belki biraz daha fazla kod gösterebilirdin?

+0

Teşekkürler .. Şimdiden şüphe duydum. Daha fazla kod göstermek bu noktada mantıklı olmaz çünkü bu Python betiği oldukça büyük, iyi yapılandırılmış ve iyi yazılmış değildir. Şimdiye kadar çok iyi bir genel bakışım yok. Bilgilerinizin yardımıyla öncelikle sorunu kendim bulmaya çalışacağım. –

+0

Bir soru daha: örneğinizde, 'f.close()' yerine 'del f 'kullandınız, bu da bir geri dönüşle sonuçlanacaktır. Python'un çöp toplama işlemi sırasında olanla eşdeğer mi? –

+0

İlk tahminim, MPI paralelleştirmesi kullanan komut dosyasıyla ilgili bir şeylerin olması - yani farklı işlemler arasında paylaşılan dosya tanımlayıcıları olmasıdır. –

10

Dosya açıldığında yanlış mod kullanırsanız bu hatayı alabilirsiniz. Örneğin:

with open(output, 'wb') as output_file: 
     print output_file.read() 

Bu kod, dosyayı okumak istiyorum ama modu wb yerine r veya kullanım r+

İlgili konular