मेरे पास निर्देशिका है जिसमें विभिन्न स्क्रैपर की एकाधिक उपनिर्देशिकाएं हैं। आप स्क्रिप्ट लिखने के बारे में कैसे जाएंगे जो प्रत्येक उपनिर्देशिका में सीडी करेगा और स्क्रैपर चलाएगा, सीडी आउट फिर अगले को जारी रखेगा यदि संभव हो तो ऐसा करने का सबसे अच्छा तरीका क्या होगा?

निर्देशिका कैसी दिखती है इसका उदाहरण:

- All_Scrapers (parent dir)
   - Scraper_one (sub dir folder)
       - scraper.py
   - Scraper_two (sub dir folder)
       - scraper.py
   - Scraper_three (sub dir folder)
       - scraper.py
   - all.py

सभी स्क्रैपर्स का मुख्य कार्य होता है

 if __name__ == "__main__":
         main()
0
Liban West 11 अक्टूबर 2018, 13:17

2 जवाब

सबसे बढ़िया उत्तर

ऐसा करने का एक तरीका है अपनी निर्देशिकाओं के माध्यम से चलना और प्रोग्रामेटिक रूप से आपके लिए आवश्यक मॉड्यूल आयात करना।

यह मानते हुए कि Scraper X folder एक ही उपनिर्देशिका में हैं scrapers और आपके पास batch_run.py स्क्रिप्ट है जिसमें scrapers (इसलिए, एक ही पथ स्तर पर), निम्नलिखित स्क्रिप्ट चाल चलेगी:

import os
import importlib

base_subdir = 'scrapers'

for root, subdirs, filenames in os.walk(base_subdir):
    for subdir in subdirs:
        if not subdir.startswith('__'):
            print(root, subdir)
            submodule = importlib.import_module('.'.join((root, subdir, 'scraper')))
            submodule.main()

संपादित करें

यदि स्क्रिप्ट base_subdir पथ के अंदर है, तो कोड को थोड़ा बदलकर import_module() कहा जा सकता है।

import os
import importlib

base_subdir = '.'

for root, subdirs, filenames in os.walk(base_subdir):
    for subdir in subdirs:
        if not subdir.startswith('__'):
            print(root, subdir)
            script = importlib.import_module('.'.join((subdir, 'scraper')), root)
            script.main()

संपादित करें २

कुछ स्पष्टीकरण:

import_module() का उपयोग कैसे किया जा रहा है?

import_module() लाइन, वास्तव में यही है काम कर रहा है। मोटे तौर पर, जब इसका उपयोग केवल एक तर्क के साथ किया जाता है, अर्थात।

alias = importlib.import_module("my_module.my_submodule")

यह इसके बराबर है:

import my_module.my_submodule as alias

इसके बजाय, जब दो तर्कों के साथ प्रयोग किया जाता है, अर्थात।

alias = importlib.import_module("my_submodule", "my_module")

यह इसके बराबर है:

from my_module import my_submodule as alias

यह दूसरा रूप सापेक्ष आयात (यानी . या .. विशेष निर्देशिकाओं का उपयोग करके आयात) के लिए बहुत सुविधाजनक है।

if not subdir.startswith('__'): क्या कर रहा है?

जब आप एक मॉड्यूल आयात करते हैं, तो पायथन व्याख्या करने के लिए कुछ बाइटकोड उत्पन्न करेगा और यह परिणाम को __cache__ निर्देशिका के तहत .pyc फाइलों के रूप में कैश करेगा। उपरोक्त पंक्ति से बचने के लिए, निर्देशिकाओं के माध्यम से चलते समय, __cache__ (वास्तव में, __ से शुरू होने वाली कोई भी निर्देशिका) को संसाधित किया जाएगा जैसे कि इसमें आयात करने के लिए मॉड्यूल शामिल होंगे। अन्य प्रकार की फ़िल्टरिंग समान रूप से मान्य हो सकती है।

3
norok2 11 अक्टूबर 2018, 17:44

आप os.walk फ़ंक्शन की जांच कर सकते हैं जो कि निर्देशिका ट्री को पार करता है और प्रत्येक निर्देशिका पर स्क्रिप्ट चलाता है (या main फ़ंक्शन जिसमें आप स्क्रिप्ट की सामग्री को लपेट सकते हैं)।

एक उदाहरण कोड होगा:

import os
for root, dirs, files in os.walk(".", topdown=False):
   scraper_main()
0
sophros 11 अक्टूबर 2018, 13:21