2013-02-07 14 views
8

पर 'जादू` लाइब्रेरी के लिए गुम फाइलें मुझे विंडोज़ पर कुछ फाइलों के लिए माइम प्रकार प्राप्त करने की आवश्यकता है, इसलिए मैंने python-magic (32-बिट पायथन 2.7.3 पर) स्थापित किया है।
यह यूनिक्स magic लाइब्रेरी पर निर्भर करता है।
लेखक gnuwin32 प्रोजेक्ट से regex2.dll, zlib1.dll और magic1.dll प्राप्त करने के निर्देश देते हैं। इसलिए मैंने फ़ाइलों को एक फ़ोल्डर में सहेजा और फ़ोल्डर को मेरे सिस्टम PATH में जोड़ा।
अब जब मैं magic तरीकों पर अमल, मैं फ़ाइल अपवाद लापता हो:विंडोज

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! 

DLLs पथ में, मैं डिबगिंग की कोशिश की और magic1.dll सही ढंग से स्थित है रहे हैं, लेकिन कहीं न कहीं अंदर पुस्तकालय एक अपवाद फेंकता है।
gnuwin32 पैकेज के अंदर मुझे magic और magic.mgc मिला है। मैं उन्हें उसी फ़ोल्डर में रखा गया है, और

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) 

यह स्पष्ट रूप से होता है क्योंकि अजगर dll, जो सादे पाठ के रूप में magic फ़ाइल को खोलने की कोशिश करता है पर WindowsError: [Error 126] मिला है। कोड में फ़ाइल नामों के लिए .dll जोड़ने के बाद मुझे वही magic.MagicException: could not find any magic files! मिलता है।
मुझे कौन सी फाइलें याद आ रही हैं?

अद्यतन:

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 

अद्यतन 2 (हल):

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

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

सिर्फ़ स्पष्ट

+0

बेवकूफ सवाल स्थापित पिप के माध्यम से अजगर-जादू के माध्यम से सुलभ हो सकता है, के बाद आप 'PATH' को DLL का जोड़ दिया है आप कमांड प्रॉम्प्ट को पुनः आरंभ और इससे पहले कि आप स्क्रिप्ट निष्पादित है? (बेवकूफ सवाल, क्योंकि आप स्पष्ट रूप से सीटीपीएस के आसपास अपना रास्ता जानते हैं) – Torxed

+0

"क्या आपने कमांड प्रॉम्प्ट को फिर से शुरू किया है जब आपने डीएलएल को पाथ में जोड़ा है" - हाँ, मैंने – user2052437

+0

डीएल को उसी निर्देशिका में रखने का प्रयास किया और ctypes को आजमाएं उन पर? या अगर इससे शुरू करने में मदद मिल सकती है? मुझे नहीं पता कि वे डीएलएल की विशिष्ट जगह पर '। /' की तलाश में हैं, लेकिन यह कोशिश करने के लिए अच्छा हो सकता है? - बकवास, बस सवाल फिर से पढ़ें .. आप पहले से ही किया है .. (मैं थक गया हूँ, 00:00 पूर्वाह्न) – Torxed

उत्तर

2

magic फ़ाइल का पथ फ़ाइल निर्दिष्ट करना पड़ा स्पष्ट रूप से करने के लिए पारित किया जाना है कन्स्ट्रक्टर

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

हमें जादू फ़ाइल के पथ को कहाँ से पारित करना चाहिए? – picomon

+0

@picomon सही प्रश्न। सीमित संचार कौशल वाले लोग ऐसे विवरणों का उल्लेख करना भूल जाते हैं –

10

भविष्य गूगल आगंतुकों के लिए: एक अन्य समाधान, जादू फ़ाइल को इंगित करने के लिए सिस्टम में स्थापित करने में% जादू% वातावरण चर सेट कर रहा है मेरे लिए यह था:

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

हार्डकोड करने की कोई ज़रूरत नहीं आपके कार्यक्रम में पथ!

2

चूंकि पाइथन-जादू की समस्याएं काफी आम लगती हैं, यहां भविष्य के googlers के लिए एक कामकाजी समाधान: स्रोत कोड को बदलने के बिना अधिकांश समाधानों का परीक्षण करने के बाद, मुझे बॉक्स से बाहर काम करने वाले पायथन-जादू प्राप्त करने के लिए निम्नलिखित पाया गया :

  1. स्थापित GnuWin32 fileपहले
  2. सेट वातावरण चर जादू = पथ \ के लिए \ gnuwin32 \ शेयर \ विविध \ जादू
  3. सभी स्थापित निष्पादनयोग्य आश्वासन/lib raries पथ