2016-04-19 10 views
1

Ich versuche, mehrere Funktionen aus separaten Dateien alle mit den gleichen Namen in Python 3.Validieren mehrere Module mit Python3

So zu validieren, halte ich ein Verzeichnis von Verzeichnissen haben: dir1 die s1 hat, s2, s3 , ..., sn, die alle Verzeichnisse sind und jeweils eine Datei mit dem Namen submission.py enthalten. Ich weiß nicht, was s1 durch sn bis zur Laufzeit sind.

In jedem submission.py gibt es Funktionen f1 bis fm.

Ich möchte ein Skript erstellen, die f1 durch fm ausführt und druckt ihre Ausgabe für jeden s1 durch sn ‚s submission.py Datei.

Ich würde gerne denken, dass ich jede submission.py Datei in jedem Verzeichnis importieren konnte, aber das Problem ist, dass jede Datei denselben Namen hat. Auch s1 bis sn ist bis zur Laufzeit nicht bekannt. Offensichtlich kann ich s1 durch sn unter Verwendung der os.listdir() Funktion bestimmen.

Irgendeine Idee, wie ich f1 aus zwei verschiedenen Dateien aufrufen kann, nachdem ich die Namen der Verzeichnisse durch os.listdir() und os.path.isdir() bekommen habe?

Ein anderes Plakat vorgeschlagen dies für 2.7:

Dies ist möglich, imp verwenden.

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

dann eine Funktion f3 im submission.py Modul in Unterverzeichnis s2 beispielsweise enthalten sind, zu nennen, wäre es: modules['s2'].f3().

Dies wäre eine perfekte Lösung. Kann jemand eine ähnliche Lösung in Python 3.4 oder 3.5 vorschlagen?

+0

Betrachten Sie [Importlib] (https: //docs.python.org/3/library/importlib.html) – SiHa

+0

Going to guckt das. Können Sie mir vorschlagen, wie ich es benutzen würde? –

+0

Die Dokumentation, die ich verlinkte, ist ziemlich umfangreich. Warum nicht einfach versuchen und sehen, wie es dir geht? Der Teil über die Module, die alle denselben Namen haben, spielt keine Rolle, wenn sie sequentiell importiert werden. Bei jedem nachfolgenden Import wird einfach der vorherige im Python-Namespace überschrieben. – SiHa

Antwort

0

importlib unterstützt nicht importieren einen vollständigen Pfadnamen, unterstützt aber den Import aus Paketen.
Sie können jedes Unterverzeichnis, s1, s2 usw., ein Paket erstellen, indem Sie im Verzeichnis ein Leerzeichen __init__.py hinzufügen und dann importlib verwenden.

in jedem Verzeichnis So haben Sie __init__.py und submission.py

Dann wird der folgende Beispielcode sollte funktionieren:

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

Bitte beachte, dass ich auf Python bin 2, die nur importlib.import_module() hat, Python 3 hat mehr Funktionalität, aber ich würde erwarten, dass das oben genannte noch funktioniert.

Nicht auch, dass das Verzeichnis, das s1 usw. enthält, in Ihrem PYTHONPATH enthalten sein muss.

Verwandte Themen