2016-05-31 2 views
0

Я пишу диспетчер пакетов python, и я делаю это так, чтобы он генерировал объект __all__ на основе программ/пакетов в текущем каталоге, но я также хочу игнорировать любые не-пакеты. то есть, если я имел следующую структуру каталогов:Получить все файлы и каталоги в текущем каталоге python

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

Я хочу, чтобы переменная __all__ быть следующим:

__all__ = ['prog1', 'package'] 

Я пробовал различные вещи, но честно говоря, я понятия не имею, что я делаю.

Это то, что я пытался в прошлом:

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

Пожалуйста, показать, что вы «Пробовал, и какую документацию вы прочитали. –

+0

@BryanOakley Я еще не показывал, что я пробовал, потому что он не работал почти так, как я этого хотел, и я не хотел, чтобы ответы на этом посту были касательными. – mcchucklezz

+2

Не делайте этого: не делайте динамику '__all__'. Просто * явно * укажите, какие функции и переменные вы хотите экспортировать из модуля. – Evert

ответ

1

Вы хотите, чтобы все .py-файлы и все каталоги с __init__.py файла данного каталога, используйте glob:

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