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

在所有子目录中运行多个python文件,python,web-scraping,Python,Web Scraping,我有一个包含多个子目录的目录。您将如何编写脚本,将cd放入每个子目录并运行scraper,cd out,然后继续下一个,如果可能的话,最好的方法是什么 目录外观的示例: - All_Scrapers (parent dir) - Scraper_one (sub dir folder) - scraper.py - Scraper_two (sub dir folder) - scraper.py - Scraper_three (sub dir f

我有一个包含多个子目录的目录。您将如何编写脚本,将cd放入每个子目录并运行scraper,cd out,然后继续下一个,如果可能的话,最好的方法是什么

目录外观的示例:

- 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()
您可能希望检查遍历目录树的函数,并在每个目录中运行脚本(或可以将脚本内容包装到其中的
main
函数)

一个示例代码是:

import os
for root, dirs, files in os.walk(".", topdown=False):
   scraper_main()
您可能希望检查遍历目录树的函数,并在每个目录中运行脚本(或可以将脚本内容包装到其中的
main
函数)

一个示例代码是:

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

一种方法是遍历目录,并通过编程导入所需的模块

假设
Scraper X文件夹
s位于相同的子目录
scrapers
,并且在包含
scrapers
的目录中有
batch_run.py
脚本(因此,在相同的路径级别),下面的脚本将执行此操作:

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 一些解释:

如何使用导入模块()? 这条线实际上是在做这项工作。粗略地说,当它仅用于一个参数时,即

alias = importlib.import_module("my_module.my_submodule")
这相当于:

import my_module.my_submodule as alias
from my_module import my_submodule as alias
相反,当与两个参数一起使用时,即

alias = importlib.import_module("my_submodule", "my_module")
这相当于:

import my_module.my_submodule as alias
from my_module import my_submodule as alias
第二种形式对于相对导入非常方便(即使用
特殊目录进行导入)

如果不是子目录startswith(“\uuu”):在做什么?
导入模块时,Python将生成一些要解释的字节码,并将结果作为
.pyc
文件缓存在
\uuuuuuuu缓存
目录下。前面提到的行将避免在遍历目录时,
\uuuuuu cache\uuuuuu
(实际上,任何以
\uuuuuuu
开头的目录)将被处理为包含要导入的模块。其他类型的过滤也可能同样有效。

一种方法是遍历目录并以编程方式导入所需的模块

假设
Scraper X文件夹
s位于相同的子目录
scrapers
,并且在包含
scrapers
的目录中有
batch_run.py
脚本(因此,在相同的路径级别),下面的脚本将执行此操作:

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 一些解释:

如何使用导入模块()? 这条线实际上是在做这项工作。粗略地说,当它仅用于一个参数时,即

alias = importlib.import_module("my_module.my_submodule")
这相当于:

import my_module.my_submodule as alias
from my_module import my_submodule as alias
相反,当与两个参数一起使用时,即

alias = importlib.import_module("my_submodule", "my_module")
这相当于:

import my_module.my_submodule as alias
from my_module import my_submodule as alias
第二种形式对于相对导入非常方便(即使用
特殊目录进行导入)

如果不是子目录startswith(“\uuu”):在做什么?
导入模块时,Python将生成一些要解释的字节码,并将结果作为
.pyc
文件缓存在
\uuuuuuuu缓存
目录下。前面提到的行将避免在遍历目录时,
\uuuuuu cache\uuuuuu
(实际上,任何以
\uuuuuuu
开头的目录)将被处理为包含要导入的模块。其他类型的筛选也可能同样有效。

查看此QA以获得一些帮助:查看此QA以获得一些帮助:因此,我在复制代码并得到此错误的scraper的同一目录中有一个文件'all.py'。TypeError:'package'参数是为“…breckland_scraper.scraper”执行相对导入所必需的。必须在父目录中,或者您必须相应地修改代码。非常感谢,但是我可以得到关于这行代码的解释吗
script=importlib.import_module('.'..join((subdir,'scraper')),root)
如果不是subdir.startswith('.'':因此,我在与scraper相同的目录中有一个文件'all.py',我复制了代码并得到了这个错误
TypeError:'package'参数是为“…breckland_scraper.scraper”执行相对导入所必需的。
它必须在父目录中,或者您必须相应地修改代码。非常感谢,但是,我可以得到这行代码的解释吗?
script=importlib.import_module('...join((subdir,'scraper')),root)
如果不是subdir.startswith('.''.'):