2013-02-07 17 views
8

Potrzebuję uzyskać typ MIME dla niektórych plików w systemie Windows, więc mam zainstalowany python-magic (na 32-bitowym python 2.7.3).
To zależy od biblioteki unix magic.
Autor nakazuje uzyskać regex2.dll, zlib1.dll i z projektu gnuwin32. Więc zapisałem pliki w folderze i dodałem folder do mojego systemu PATH.
Teraz kiedy wykonać magic metod, otrzymuję wyjątek brakuje pliku:Brakujące pliki dla biblioteki `magic` na Windows

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 są w ścieżce, próbowałem debugowanie i magic1.dll znajduje się poprawnie, ale gdzieś wewnątrz biblioteki zgłasza wyjątek.
Wewnątrz pakietu gnuwin32 znalazłem magic i magic.mgc. Umieściłem je w tym samym folderze, a dostał WindowsError: [Error 126] na

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) 

To oczywiście dzieje bo python próbuje otworzyć magic jak plik DLL, który jest zwykły tekst. Po dodaniu .dll do nazw plików w kodzie otrzymuję ten sam magic.MagicException: could not find any magic files!.
Jakie pliki brakuje?

UPDATE:

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 

UPDATE 2 (SOLVED):

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

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

prostu musiał określić plik wyraźnie

+0

Głupie pytanie, masz wznowiona wiersz polecenia po dodaniu DLL do katalogu 'PATH' i zanim wykonywany skrypt? (głupie pytanie, ponieważ najwyraźniej znasz swoją drogę wokół ctypes) – Torxed

+0

"czy uruchomiłeś ponownie wiersz poleceń PO dodałeś DLL do PATH" - tak, zrobiłem – user2052437

+0

Próbowałem umieścić dll w tym samym katalogu i wypróbować ctypes na tych? lub jeśli to może pomóc? Nie wiem, czy szukają bibliotek DLL w konkretnym miejscu, takim jak '. /', Ale może warto spróbować? - Cholera, po prostu ponownie przeczytaj pytanie ... już zrobiłeś .. (jestem zmęczony, 00:00 tutaj) – Torxed

Odpowiedz

2

Ścieżka do magic pliku musi być wyraźnie przekazane Konstruktor.

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

gdzie powinniśmy podać ścieżkę do pliku magicznego? – picomon

+0

@picomon doskonałe pytania. ludzie o ograniczonych umiejętnościach komunikacyjnych często zapominają wspomnieć o takich szczegółach –

10

Dla przyszłych użytkowników Google: Innym rozwiązaniem jest ustawienie zmiennej% Enviroment% MAGIC w otoczeniu systemów, aby wskazać pliku magicznego, dla mnie to było:

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

Nie trzeba hardcode ścieżka w twoim programie!

2

Ponieważ problemy z python-magią wydają się być dość powszechne, tutaj działające rozwiązanie dla przyszłych pracowników Google'a: Po przetestowaniu większości rozwiązań bez zmiany kodu źródłowego, znalazłem następujące rzeczy, aby uzyskać magiczne działanie Pythona po wyjęciu z pudełka :

  1. Install GnuWin32 filepierwszy
  2. ustawić zmienną środowiskową MAGIC = ścieżka \ do \ GnuWin32 \ udział \ misc \ magia
  3. Zapewniam wszystkie zainstalowane pliki wykonywalne/lib raries być dostępne za pośrednictwem PATH
  4. Instalacja Pythona magii poprzez pip
Powiązane problemy