2013-04-25 21 views
6

Çeşitli komutları çalıştırmak için os.system kullanan bir Python programım var. (subprocess, Python 2.0'a kadar geriye doğru uyumlu olması gerektiğinden kullanılamaz.)Baskı "X.dll dosyası eksik olduğundan program başlatılamıyor" hata iletisi

Windows'ta, bazen komutlar olağandışı bir dizinde DLL'lere başvurur ve bu nedenle de "Program olabilir" t çünkü X.dll eksik "hata açılır.

Windows error popup with title "cl.exe - System Error" and text "The program can't start because mspdb80.dll is missing from your computer. Try reinstalling the program to fix this problem."

Sorum komutu bütün dll bulmak yapmak hakkında değil olduğunu. Bunu nasıl yapacağımı zaten biliyorum. Bilmek istediğim, bir DLL eksik olduğunda bu iletişim kutusunu göstermemesi için Windows 'a nasıl söylerim? Bunun yerine, alt işlem hata iletisini (os.system çağrısı içinde bir dosyaya yönlendirilen) stderr'e yazmalı ve başarısız bir şekilde çıkmalıdır (bir hata kodunu döndürmek için os.system'a neden olmak). Bu şekilde programım hatayı yakalayabilir ve birileri Tamam'a tıklamak için gelene kadar askıya almak yerine kendi yolunda rapor edebilir.

MSDN normalde arkadaşım, ancak bu sefer hiçbir şey elde etmemekle birlikte, eksik olan özel DLL'lerle nasıl başa çıkılacağı konusunda tavsiyem var.

Yinelemek gerekirse, bu bir aşırı-geriye dönük uyumluluk durumudur: Python 2.7 ya da herhangi bir eski sürümde 2.0'a kadar tümüyle çalışan bir çözüme ihtiyacım var. Ayrıca Windows'un tüm popüler sürümlerinde de çalışmalıdır (XP, Vista, 7, 8). Daha büyük numaralı Windows ile çalışmak oldukça istenir, ancak% 100 gerekli değildir. Ayrıca, başka bir dilde yazılmış üçüncü taraf modüller ve yardımcı programlar bir seçenek değildir. (Bir .BAT dosyasının doğru olacağını varsayalım, eğer bunu yapmanın tek yolu buysa.)

+0

Biraz açıklayabilir misiniz? Python içermeyen bu makinede cl.exe'yi çalıştırırsanız, bu aynı hata olur mu? – Krets

+0

Seçtiğim birkaç 'PATH' ayarından hangisine bağlı olarak olabilir veya olmayabilir. * Ama bu sorunun amacı değil. * Ben zaten 'PATH' nasıl ayarlanacağını biliyorum. Soru, bu bant dışı iletişim kutusu yerine programıma bildirilecek * hatanın * nasıl alınacağıdır. – zwol

cevap

7

İletişim kutusu, SetErrorMode numaralı arama işlemi için devre dışı bırakılabilir. Ancak, SEM_FAILCRITICALERRORS tarafından kapsanan "kritik hataların" biri olarak nitelendirdiğini keşfetmek için LoadLibrary belgelerini okumak gerekir.

Hata modu, CREATE_DEFAULT_ERROR_MODE ile oluşturulmadıkları sürece alt süreçleri devralır ve CMD.EXE bu bayrağı alt süreçler oluşturduğunda ayarlamaz. altişlem (belirli bir hata koduyla sonlandırır: Yani

if sys.platform == 'win32': 
    try: 
     import ctypes 
     # SEM_FAILCRITICALERRORS|SEM_NOGPFAULTERRORBOX|SEM_NOOPENFILEERRORBOX 
     ctypes.windll.kernel32.SetErrorMode(0x0001|0x0002|0x8000) 
    except: 
     pass 

Bu optimal bir çözüm değildir ... aslında Umursadığım durumda iletişim kutusunu bastırmak yok benim Python komut başlangıçta hata modunu ayarlayarak 0xC0000135 - aslında "eksik DLL" olarak belgelenen değil, ama bu sayıyı ararken ne zaman ortaya çıkıyor, ama ayrıntıları - hangi DLL eksik gibi - ayrıntıları yere düştü. Yükleyicinin ayrıntıları stderr'e bildirmesini sağlayan bir ayar bulmayı umuyorum.

İlgili konular