2013-02-07 12 views
8

Windows'ta bazı dosyalar için mim türü almam gerekiyor, bu yüzden python-magic (32 bit python 2.7.3 üzerinde) yükledim.
Unix magic kitaplığına bağlıdır.
Yazar, gnuwin32 projesinden regex2.dll, zlib1.dll ve magic1.dll numaralarını almayı öğütler. Bu yüzden dosyaları bir klasöre kaydettim ve klasörü sistemime PATH ekledim.
Şimdi ben dosya istisna eksik olsun, magic yöntemleri çalıştırma zaman:Windows'taki "sihirli" kitaplığı için eksik dosyalar

import magic 
print(magic.Magic()) 

Traceback (most recent call last): 
File "C:/Users/Admin/PycharmProjects/lex/lex.py", line 367, in <module> 
    test_magic() 
File "C:/Users/Admin/PycharmProjects/lex/lex.py", line 364, in test_magic 
    print(magic.Magic()) 
File "C:\Python27\lib\site-packages\python_magic-0.4.3-py2.7.egg\magic.py", line 52, in __init__ 
    magic_load(self.cookie, magic_file) 
File "C:\Python27\lib\site-packages\python_magic-0.4.3-py2.7.egg\magic.py", line 188, in magic_load 
    return _magic_load(cookie, coerce_filename(filename)) 
File "C:\Python27\lib\site-packages\python_magic-0.4.3-py2.7.egg\magic.py", line 139, in errorcheck 
    raise MagicException(err) 
magic.MagicException: could not find any magic files! 

DLL PATH i hata ayıklama denenmiş ve magic1.dll doğru bulunduğu, ancak kütüphane bir istisna atar içinde bir yerlerde.
gnuwin32 paketinin içinde magic ve magic.mgc bulundu. Aynı klasöre yerleştirilir ve piton düz metindir dll gibi magic dosyayı açmaya çalıştığı için bu besbelli olur

libmagic = None 
# Let's try to find magic or magic1 
dll = ctypes.util.find_library('magic') or ctypes.util.find_library('magic1') 

# This is necessary because find_library returns None if it doesn't find the library 
if dll: 
    libmagic = ctypes.CDLL(dll) 

üzerinde WindowsError: [Error 126] aldık. Koddaki dosya isimlerine .dll ekledikten sonra aynı magic.MagicException: could not find any magic files!'u elde ediyorum.
Hangi dosyalarda eksiklerim?

GÜNCELLEME:

C:\Users\Admin>file C:\123.zip -m magic 
file: could not find any magic files! 

C:\Users\Admin>file C:\123.zip -m "C:\@DEV\@LIB\@Magic\GetGnuWin32\bin\magic" 
C:\123.zip; ASCII text, with no line terminators 

C:\Users\Admin>cd C:\@DEV\@LIB\@Magic\GetGnuWin32\bin 

C:\@DEV\@LIB\@Magic\GetGnuWin32\bin>file C:\123.zip -m magic 
C:\123.zip; ASCII text, with no line terminators 

GÜNCELLEME 2 (ÇÖZÜLDÜ):

print(magic.Magic()) 
magic.MagicException: could not find any magic files! 

print(magic.Magic(magic_file = 'magic')) 
<magic.Magic instance at 0x02A5E198> 

sadece açıkça

+0

Aptal soru pip aracılığıyla piton-sihirli yükleyin PATH üzerinden erişilebilir olması için, size 'PATH' için DLL ekledik SONRA komut istemini yeniden ve komut dosyasını idam ÖNCE var? (aptalca soru, çünkü sen açıkça ctypes etrafında yolunu bildiğinizden) – Torxed

+0

"DLL'leri PATH'a ekledikten sonra komut istemini yeniden başlattınız mı?" - evet, ben – user2052437

+0

yaptım dll'leri aynı dizine yerleştirip denedim bunlarda? ya da bunun başlaması için yardımcı olabilir? DLL'leri gibi bir yerde arıyorlar mı bilmiyorum./'Sadece denemek için iyi olabilir mi? - Crap, sadece soruyu tekrar oku .. .. zaten yaptın .. (ben yoruldum, 00:00 AM burada) – Torxed

cevap

2

Yol magic dosyaya dosyayı belirtmek zorunda açıkça geçirilecek vardır yapıcı. Gelecekteki google ziyaretçiler için

magic_object = magic.Magic(magic_file = 'path_to_magic_files/magic')) 
+3

Sihirli yolun yolunu nereye koymalıyız? – picomon

+0

@picomon mükemmel sorular. Sınırlı iletişim becerilerine sahip kişiler, bu gibi detaylardan bahsetmeyi unutabiliyorlar. –

10

: Başka bir çözüm benim için sihirli dosyasına işaret etmek sistemler ortamda% MAGIC% ortamı değişkeni ayarlıyor oldu:

"c:\Program Files (x86)\GnuWin32\share\misc\magic" 

hardcode gerek yok programınızdaki yol!

2

Python-magic problemleri oldukça yaygın gibi gözüktüğü için, geleceğin google'ları için bir çalışma çözümü: Kaynak kodunu değiştirmeden çoğu çözümü test ettikten sonra, python-magic'in kutudan çıkmasını sağlamak için aşağıdakileri buldum. :

  1. GnuWin32 fileilk
  2. Set ortam değişkeni MAGIC = yol \ etmek \ GnuWin32 \ share \ misc \
  3. tüm yüklü yürütülebilir Assure sihirli/lib yükleyin raries