2016-05-31 5 views
0

Ich schreibe einen Python-Paket-Manager, und ich mache es so, dass es generiert das __all__ Objekt basierend auf den Programmen/Pakete im aktuellen Verzeichnis, aber ich möchte auch ignorieren Nicht-Pakete. dh wenn ich die folgende Verzeichnisstruktur hatte:Holen Sie sich alle Dateien und Verzeichnisse im aktuellen Verzeichnis python

project 
|------__init__.py 
|------prog1.py 
|------package 
    |------__init__.py 
    |------prog2.py 
|------resources 
    |------ping.png 

Ich möchte die __all__ Variable, die folgenden sein:

__all__ = ['prog1', 'package'] 

Ich habe verschiedene Dinge ausprobiert, aber ganz ehrlich, ich habe keine Ahnung Was mache ich.

Dies ist, was ich versuchte, zuletzt:

import os 
from os import path 


def config_all(directory): 
    __all__ = [] 
    directory = path.abspath(directory) 
    for root, dirs, files in os.walk(directory, topdown=False): 
     for d in dirs: 
      os.chdir("/czar/".join(path.abspath(d).rsplit("/", 1))) 
      v = list(os.walk('.'))[0][2] 
      if "__init__.py" in v: 
       __all__.append(d) 
      for i in v: 
       while i in __all__: 
        __all__.remove(i) 
      os.chdir('..') 
     for f in files: 
      __all__.append(path.join(root, f).rsplit("/", 1)[1].rsplit(".", 1)[0]) 
    return __all__ 

__all__ = config_all('czar/') 
print(__all__) 
+1

zeigen Bitte, was Sie habe es versucht, und welche Dokumentation du gelesen hast. –

+0

@BryanOakley Ich habe nicht gezeigt, was ich bisher versucht habe, weil es nicht so funktioniert hat, wie ich es wollte, und ich wollte nicht, dass die Antworten auf diesen Beitrag tangential sind. – mcchucklezz

+2

Tun Sie dies nicht: Machen Sie '__all__' nicht dynamisch. Einfach * explizit * angeben, welche Funktionen und Variablen aus einem Modul exportiert werden sollen. – Evert

Antwort

1

Sie wollen alle Py-Dateien und alle Verzeichnisse mit einem __init__.py Datei des Verzeichnisses angegeben, glob verwenden:

def config_all(directory): 
    result = [] 
    for filename in glob.iglob(os.path.join(directory, '*', '__init__.py')): 
     result.append(os.path.basename(os.path.dirname(filename)) 
    for filename in glob.iglob(os.path.join(directory, '*.py'): 
     result.append(os.path.splitext(os.path.basename(filename))[0]) 
    return result 
Verwandte Themen