2016-01-20 2 views
6

में उपयोग किए गए सभी तृतीय पक्ष पैकेजों और उनके स्वयं के कार्यों की सूची मेरे पास मेरे सहयोगियों द्वारा लिखे गए कई पायथन पैकेज हैं और मैं यह जांचने के लिए एक उपकरण लिखना चाहता हूं कि वे किस तीसरे पैकेज पर भरोसा करते हैं।पाइथन फ़ाइल

इस

#it is my package, need to check,call it example.py 
#We have more than one way to import a package, It is a problem need to consider too 

from third_party_packages import third_party_function 

def my_function(arg): 
    return third_party_function(arg) 

की तरह और उपकरण इस

result = tool(example.py) 
#this result should be a dict like this structure 
#{"third_party_function":["my_function",]} 
#Means "my_function" relies on "third_party_function" 

मैं पता नहीं है कि कैसे करना है की तरह काम करना चाहिए, सब मैं इस उपकरण के कार्यान्वयन ऊपर आ सकता है एक अजगर फ़ाइल पढ़ने के लिए है स्ट्रिंग के रूप में एक पंक्ति से लाइन, और इसकी तुलना करने के लिए regex का उपयोग करें। क्या आप मुझे कुछ सलाह दे सकते हैं?

यदि आपको नहीं पता कि मेरा क्या मतलब है, तो कृपया अपने प्रश्न पर टिप्पणी करें, मैं जितनी जल्दी हो सके इसे ठीक कर दूंगा। धन्यवाद!

+1

यदि आपके पास एक कामकाजी माहौल है यानी आपके पाइथन इंस्टॉलेशन में स्थापित सभी संकुल आप 'पीआईपी' जैसे 'पीआईपी फ्रीज' require.pip' का उपयोग कर सकते हैं फाइल 'requirement.pip' फाइल को सभी संकुल सूचीबद्ध करने के लिए (अप्रत्यक्ष रूप से संकुल अपनी परियोजना चलाने की जरूरत है) –

+0

यह उत्तर देने का एक आसान सवाल नहीं है। –

+0

आपकी सलाह के लिए धन्यवाद, दुर्भाग्यवश, पीपी द्वारा स्थापित सभी पैकेज नहीं, कुछ संकुल स्वयं द्वारा लिखे गए हैं। मुझे उन्हें सौदा करने की ज़रूरत है। – Fudun

उत्तर

3

आप ast मॉड्यूल के साथ अपनी फ़ाइलों को पार्स कर सकते हैं और सभी Import और ImportFrom स्टेटमेंट देख सकते हैं।

>>> import ast 
>>> tree = ast.parse('import a; from b import c') 
>>> tree.body 
[<_ast.Import object at 0x7f3041263860>, <_ast.ImportFrom object at 0x7f3041262c18>] 
>>> tree.body[0].names[0].name 
'a' 
>>> tree.body[1].module 
'b' 
>>> tree.body[1].names[0].name 
'c' 

आपकी स्क्रिप्ट इस तरह काम कर सकता था:

आप एक विचार देने के लिए, यहां एक उदाहरण दिया

  1. के माध्यम से ast.parse
  2. यात्रा का उपयोग कर प्रत्येक नोड स्रोत फ़ाइल पार्स ast.walk()
  3. यदि कोई नोड Import या ImportFrom ऑब्जेक्ट है, तो नामों का निरीक्षण करें और आपके पास क्या करें करने के लिए।

ast का उपयोग नियमित अभिव्यक्तियों या कस्टम पार्सर से कहीं अधिक आसान और अधिक मजबूत है।

+0

आपको बहुत धन्यवाद, और यह मेरे लिए काम जैसा दिखता है ~ I कल इसका परीक्षण करेंगे हम तुरंत कार्यालय पहुंचेंगे ~ और मैं परिणाम पोस्ट करूंगा ~ – Fudun

+0

यह मेरे लिए काम करता है! धन्यवाद soooooooooooooooooo बहुत! – Fudun

संबंधित मुद्दे