在所有子目录中运行多个python文件

时间:2018-10-11 10:17:37

标签: python web-scraping

我的目录包含不同刮板的多个子目录。您将如何编写脚本,将其CD放入每个子目录中并运行刮板,将CD取出,然后继续执行下一个脚本,如果可能的话,什么是最好的方法?

目录外观示例:

- 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()

2 个答案:

答案 0 :(得分:1)

一种方法是浏览目录并以编程方式导入所需的模块。

假设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()

编辑2

一些解释:

import_module()的使用方式如何?

import_module()行是实际执行的工作。粗略地说,当它仅与一个参数一起使用时,即

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

它等效于:

import my_module.my_submodule as alias

相反,当与两个argumens一起使用时,即

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

它等效于:

from my_module import my_submodule as alias

第二种形式对于相对导入(即使用...特殊目录的导入)非常方便。

if not subdir.startswith('__'):在做什么?

导入模块时,Python将生成一些待解释的字节码,并将结果作为.pyc文件存储在__cache__目录下。上述行将避免在遍历目录时__cache__(实际上,任何以__开头的目录)都将被处理为好像包含要导入的模块。其他类型的过滤可能同样有效。

答案 1 :(得分:0)

您可能需要检查遍历目录树的os.walk函数,并在每个目录下运行脚本(或可以将脚本内容包装到其中的main函数)。

示例代码为:

import os
for root, dirs, files in os.walk(".", topdown=False):
   scraper_main()