Могу ли я импортировать все Python файлы из папки одновременно? - PullRequest
0 голосов
/ 13 апреля 2020

Мне интересно, можно ли импортировать все файлы Python из папки или мне нужно импортировать каждый файл отдельно? Я настроил проект, в котором есть папка «website_functions» с 20 Python файлами. Каждый из них содержит одну функцию (я использую Selenium для доступа к разным веб-сайтам, и каждый файл соответствует одному веб-сайту). Отсутствие необходимости импортировать их по отдельности сделает это намного быстрее.

Заранее спасибо за ответ

Ответы [ 2 ]

0 голосов
/ 13 апреля 2020

Да, это возможно. В папке, полной файлов, которые вы хотите импортировать sh, укажите все имена файлов в списке с именем __all__ в файле __init__.py. Из программы, в которую вы будете sh импортировать файлы, вы можете импортировать их сейчас, используя from directory import *.

. Рассмотрим следующий пример.

Структура каталогов проекта:

.
|-- main.py
`-- modules
    |-- __init__.py
    |-- f.py
    `-- g.py

1 directory, 4 files

main.py

from modules import *

f.f1()
f.f2()
g.g1()
g.g2()

modules / f.py

def f1():

    print("This is f1() from modules/f.py.")

def f2():

    print("This is f2() from modules/f.py.")

modules / g.py

def g1():

    print("This is g1() from modules/g.py.")

def g2():

    print("This is g2() from modules/g.py.")

modules / __ init__.py

__all__ = ["f", "g"]

Вывод main.py выглядит следующим образом.

This is f1() from modules/f.py.
This is f2() from modules/f.py.
This is g1() from modules/g.py.
This is g2() from modules/g.py.

Если вы хотите, чтобы список __all__ в __init__.py генерировался автоматически при каждом запуске вашей программы Вы можете сделать это, используя библиотеку os. Например:

(я удалил f.py из этого примера, чтобы не мешать атрибуту f modules.)

modules / __ init __. Py

import os

__all__ = []
dirname = os.path.dirname(os.path.abspath(__file__))

for f in os.listdir(dirname):
    if f != "__init__.py" and os.path.isfile("%s/%s" % (dirname, f)) and f[-3:] == ".py":
        __all__.append(f[:-3])

main.py

from modules import *

g.g1()
g.g2()

Вывод main.py выглядит следующим образом.

This is g1() from modules/g.py.
This is g2() from modules/g.py.
0 голосов
/ 13 апреля 2020

Я бы сказал, что это очень плохая идея, и она нарушает Руководство по стилю pep8

Но если вам действительно нужно это сделать, вы можете взломать его так:

import importlib
from glob import glob

# Get list of *.py files
modules = glob('*.py')
# Get rid of *.py extension
modules = [module[:-3] for module in modules]

for module in modules:
    importlib.import_module(module)
...