2016-04-19 3 views
1

Я пытаюсь проверить несколько функций из отдельных файлов все с теми же именами в Python 3.Проверка нескольких модулей с Python3

Итак, рассмотрим У меня есть каталог каталогов: dir1 который имеет s1, s2, s3 , ..., sn, которые все являются каталогами, и каждый из них содержит файл с именем submission.py. Я не знаю, что s1 через sn до запуска.

В каждом submission.py есть функции f1 по fm.

Я хотел бы создать скрипт, который выполняет f1 через fm и выводит свою продукцию для каждого s1 через submission.py файл sn «s.

Я хотел бы думать, что я могу импортировать каждый файл submission.py в каждый каталог, но проблема в том, что каждый файл имеет то же имя. Кроме того, s1 до sn неизвестно до времени выполнения. Очевидно, что я могу определить s1 через sn с использованием функции os.listdir().

Любая идея о том, как я могу позвонить f1 из двух разных файлов после получения названий каталогов через os.listdir() и os.path.isdir()?

Другой плакат предложил это для 2.7:

Это возможно с помощью imp.

import os, imp 
dirs = os.listdir('.') 
modules = {d: imp.load_source(d, d + '/submission.py') for d in dirs} 

Затем, чтобы вызвать функцию f3 в submission.py модуля, содержащегося в подкаталоге s2, например, было бы: modules['s2'].f3().

Это было бы идеальным решением. Может ли кто-нибудь предложить аналогичное решение в Python 3.4 или 3.5?

+0

Посмотрите на [importlib] (https: //docs.python.org/3/library/importlib.html) – SiHa

+0

Идти сидеть. Можете ли вы предложить, как я буду использовать его? –

+0

Документация, которую я связывал с ее довольно обширной. Почему бы просто не попробовать и посмотреть, как вы справляетесь? Часть модулей, имеющих одинаковое имя, не имеет значения, если они импортируются последовательно. Каждый последующий импорт будет просто перезаписывать предыдущий в пространстве имен Python. – SiHa

ответ

0

importlib не поддерживает импорт с полным именем пути, но поддерживает импорт из пакетов.
Вы можете сделать каждый подкаталог s1, s2 и т. Д., Добавив пустой пробел __init__.py в каталог, а затем используйте importlib.

Таким образом, в каждом каталоге, у вас есть __init__.py и submission.py

Тогда следующий пример кода должен работать:

import importlib 
for pkg in ('s1','s2'): 
    globals()['submission'] = importlib.import_module(pkg+'.submission',pkg) 
    submission.f1() 
    submission.f2() 
    # etc... 

Обратите внимание, что я на Python 2, который имеет только importlib.import_module(), Python 3 имеет больше функциональности, но я ожидаю, что выше все еще будет работать.

Нельзя также указать, что каталог, содержащий s1 и т. Д., Должен находиться в вашем PYTHONPATH.

Смежные вопросы