我的目录包含不同刮板的多个子目录。您将如何编写脚本,将其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()
答案 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()
一些解释:
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()